HackThisSite - Application Mission 11
Challenge
Application Challenge 11 (Windows) — Find the password. (medium) 目标:从这个 Windows GUI 程序里找出 password。
包内只有一个 app11win.exe(40 KB,PE32 GUI)。程序是个
Visual Basic 6 写的窗口,界面上有一个 Text1
输入框和一个标题为 Check
的按钮:典型的输入密码点确认形态。真正的东西不在代码里,而在程序随身带着的一张图片里:password
被画成文字印在内嵌的 JPEG 上。
Solution
file app11win.exe→PE32 executable for MS Windows 4.00 (GUI), Intel i386, 3 sections;导入表只有MSVBVM60.DLL→ VB6 编译的程序。strings里能看到控件名和工程信息:Form1、Command1、Check、Text1、App Challenge、challenge5Project1;.text段偏移0x54BC处有 VB 工程头魔数VB5!。入口点把&DAT_004054bc(就是这个工程头)交给 VB 运行时初始化,是标准的 VB6 启动流程。- 二进制里 搜不到任何明文答案:
Search/Destroy/Awnser/Answer/password在 ASCII 和 UTF-16 两种编码下命中数都是 0。密码是一组像素。 binwalk app11win.exe直接报出 JPEG:
1 | $ binwalk app11win.exe |
Step 1: 提取内嵌图片
binwalk 只给出了一个 blob,但那实际上是两个叠加在一起的
JPEG。手工遍历一遍 JPEG marker 才能看清:
1 | --- walk from 0x129E --- |
结论:
- image A:从
0x129E到0x4B35,233×58,14489 字节。它不能按第一个FF D9截断:A 的 APP1 Exif 段里那张缩略图的 EOI(0x1960)会先命中,截出来的图打不开(identify直接报错),脚本因此先定位SOS再找它后面第一个真正的 EOI。 - image B:从
0x1ED6到0x2454,128×32,1408 字节;它整张位于 A 的 APP13(Photoshop IRB)段内,本质是 A 的缩略图(把 A 缩到128×32与 B 逐像素比,平均绝对差只有 5.2/255,内容一致);它只有 1408 字节,像素量不足以读出可靠文本,读数只能以 image A 为依据。
完整脚本:
1 | """Carve the two real JPEGs out of app11win.exe. |
1 | $ cd <hts-workspace>/challenges/hts-app/app11 && uv run python carve_jpegs.py |
直接读,得到 The Awnser is: Search&Destroy