看雪论坛.珠海金山2007逆向分析挑战赛――“金山杯”
第二阶段比赛 第1题
无壳,直接OD载入,可以看到:
00400310 |. 68 6C024000 PUSH 0040026C ; ASCII "test.txt"
00400315 |. 8D4D F0 LEA ECX, DWORD PTR [EBP-10]
00400318 |. E8 63010000 CALL 00400480 ; CreateFileA
很明显test.txt就是keyfile,文件大小必须在8到1k之间。
接下来读取文件的内容,对其进行变化
0040037E |. E8 FDFEFFFF CALL 00400280 ; 这里就是变化的函数
跟进函数,首先放出一块堆栈给溢出数据做准备
004002A2 |. 68 A802CC78 PUSH 78CC02A8
004002A7 |. 68 1B8F9469 PUSH 69948F1B
004002AC |. FF76 04 PUSH DWORD PTR [ESI+4]
004002AF |. FF36 PUSH DWORD PTR [ESI]
004002B1 |. E8 0A030000 CALL 004005C0 ; 文件的头8个字节做乘法
004002B6 |. 68 82FFE65B PUSH 5BE6FF82
004002BB |. 68 854716A5 PUSH A5164785
004002C0 |. 52 PUSH EDX
004002C1 |. 50 PUSH EAX
004002C2 |. E8 79020000 CALL 00400540 ; 结果进行位移计算变化
再对头8个字节进行简单的xor运算。
004002C7 |. 6A 04 PUSH 4
004002C9 |. 8BCE MOV ECX, ESI
004002CB |. 5F POP EDI
004002CC |> 8031 1C /XOR BYTE PTR [ECX], 1C
004002CF |. 8A11 |MOV DL, BYTE PTR [ECX]
004002D1 |. 3051 01 |XOR BYTE PTR [ECX+1], DL
004002D4 |. 41 |INC ECX
004002D5 |. 41 |INC ECX
004002D6 |. 4F |DEC EDI
004002D7 |.^ 75 F3 \JNZ SHORT 004002CC
运算结果变化一下得到溢出代码的大小。
004002D9 |. 6A 1A PUSH 1A
004002DB |. 59 POP ECX
004002DC |. 2BC8 SUB ECX, EAX
004002DE |. 0FAFC8 IMUL ECX, EAX
004002E1 |. 81E9 9C000000 SUB ECX, 9C
004002E7 |. 85C9 TEST ECX, ECX
最后复制到堆栈检测能否实现功能。
004002EB |. 8D7D D4 LEA EDI, DWORD PTR [EBP-2C]
004002EE |. F3:A5 REP MOVS DWORD PTR ES:[EDI], DWORD PTR [ESI]
按照要求和提示,我们只需要修改消息文字即可,函数的调用完全使用已有的代码,即改成下面的模样:
00400385 |> \57 PUSH EDI ; /Style
00400386 |. 68 68024000 PUSH 00400268 ; |Title = "OK!"
0040038B |. 68 60024000 PUSH 00400260 ; |Text = "OK!"
00400390 |. 57 PUSH EDI ; |hOwner
00400391 |. FF15 4C024000 CALL NEAR DWORD PTR [<&USER32.MessageBoxA>] ; \MessageBoxA
在EBP=12FBC4的前提下构造代码:
JMP 12FB78
DB 00, 00, 00, 00, 00, 00 ; 预留给校验值
MOV DWORD PTR [400268], 214B4F ; "OK!"
MOV DWORD PTR [400260], 214B4F
MOV DWORD PTR [400264], 0
MOV EBP,12FBC4
JMP 400383
DD 12FB70
经过asm以后其大小恰好填充堆栈到溢出点,代码段大小是0D个DD,根据这个结果反推前面一步也是0D,然后计算一个辗转相除的结果等于
7590C53F 8AD397F7
填入文件头,即可得到keyfile了。
经过本机器(xp+sp2)的测试成功
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!