⚠ 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:
- Qemu
- Mini vMac
- Apple’s image/iso (search with Google)
- MacsBug
Sử dụng Mini vMac để mở ứng dụng Super ResEdit trong disk image được cung cấp.
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/#Tools và https://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)
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ừ Dialogg
tiếp tục thực hiện chương trình/hệ thốngdm
dump memorydm a2
: dump memory tại địa chỉ có giá trị trong thanh ghi a2
t
step overs
step into
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.