⚠ Spoiler: Đây là write-up cho các challenge của Flare-on 9 tổ chức vào khoảng tháng 11/2022 tại Website.

[10] Nur geträumt

This challenge is a Macintosh disk image (Disk Copy 4.2 format, for those who need to know) containing a 68K Macintosh program. You must determine the passphrase used to decode the flag contained within the application. Super ResEdit, an augmented version of Apple's ResEdit resource editor which adds a disassembler, is also included on the disk image to help you complete the challenge, though you will likely also need to do some outside research to guess the passphrase. This application can be run on any Macintosh emulator (or any real Macintosh from as far back as a Mac Plus running System 6.0.x up to a G5 running Classic). The setup of the emulation environment is part of the challenge, so few spoilers live here, but if you want to save yourself some headaches, Mini vMac is a pretty good choice that doesn't take much effort to get up and running compared to some other options. This application was written on a Power Macintosh 7300 using CodeWarrior Pro 5, ResEdit, and Resourcerer (my old setup from roughly 1997, still alive!). It was tested on a great many machines and emulators, and validated to run well on Mac OS from 6.0.8 through 10.4. Happy solving! Be curious!

7-zip password: flare

Công cụ sử dụng:

Sử dụng Mini vMac để mở ứng dụng Super ResEdit trong disk image được cung cấp.

Untitled

Untitled

Thông tin đáng chú ý là 99 Luftballons và Nur geträumt là tên 2 ca khúc tiếng Đức của ca sĩ Nena

FLAG mang giá trị hex 0C001D1A7F171C4E0211280810480500001A7F2AF61744320FFC1A602C08101C6002194117115A0E1D0E390A04

Qemu:

Do thử nhiều cách để kích hoạt MacsBug trên Mini vMac đều không được nên hướng tiếp theo là dùng Qemu để debug ứng dụng.

Hướng dẫn debug tham khảo từ https://blog.os9.ca/2022/04/21/001-reversing-grateful-dead-d2s2/#Toolshttps://saagarjha.com/blog/2020/04/22/debugging-python-operator-precedence-with-macsbug/

Tạo Disk Image:

  • ./qemu-img create -f qcow2 macos92.img 10G

Tạo VM:

  • ./qemu-system-ppc -L pc-bios -boot d -M mac99,via=pmu -cpu “g4” -m 512 -cdrom “Macos92.iso” -hda Macos92.img -g 1024x768x32

Load các file vào VM

  • ./qemu-system-ppc -L pc-bios -boot c -M mac99,via=pmu -cpu “g4” -m 512 -hda Macos92.img -g 1024x768x32 -monitor stdio -cdrom “a.iso”
    • Tạo a.iso chứa MacsBug 6.6.3 và tập tin challenge (.dsk) bằng ImgBurn (lưu ý chọn loại không cài phần mềm quảng cáo)

Untitled

decodeFlag+48 là lệnh EOR.W thực hiện tính XOR D0, D2 lấy từ A2, A3. A2, A3 có giá trị như hình dưới tương ứng là dữ liệu nhập vào ô nhập liệu, giá trị chuỗi flag. Nếu chuỗi A2 được nhập có độ dài nhỏ hơn 0x2D thì lặp lại từ đầu chuỗi A2 (decodeFlag+5A)

Dựa vào cấu trúc flag xxxxxxxx@flare-on.com có thể dự đoán được một phần của dữ liệu cần nhập là:

import binascii

a = binascii.unhexlify("0C001D1A7F171C4E0211280810480500001A7F2AF61744320FFC1A602C08101C6002194117115A0E1D0E390A04")
b = b"@flare-on.com"
c = (a[-len(b):])

def xor(a,b):
    return bytearray([x^y for x,y in zip(a,b*10)])
    
print(xor(b, c)) # -> bytearray(b' du etwas Zei')

du etwas Zei chính là một phần của mở bài trong bài 99 Luftballons

Hast du etwas Zeit für mich
Dann singe ich ein Lied für dich
Von neunundneunzig Luftballons, auf ihrem Weg zum Horizont 

Lệnh tương tác với Qemu để kích hoạt Interrupt: nmi

Lệnh tương tác với MacsBug:

  • atb GetDialogItemText đặt breakpoint tại hàm nhận dữ liệu từ Dialog
  • g tiếp tục thực hiện chương trình/hệ thống
  • dm dump memory
    • dm a2: dump memory tại địa chỉ có giá trị trong thanh ghi a2
  • t step over
  • s step into

Untitled

Bộ nhớ ở A4 là bắt đầu chuỗi Dann_singe… trong bài hát. Khá là phù hợp.

Chuyển đổi loại bàn phím sang German để nhập chữ cái ü ở vị trí kí tự [ (Control Panels → Keyboard) và ta da! Có thông báo xác nhận flag đúng.

Thử lại trong Mini vMac → Solved.

Untitled