先运行此程序:
窗口只认识一个 flag,除此都是乱码,初步猜测乱码内容是flag的密码,我们可以通过查找字符串flag来找到窗口输出函数,进一步确定乱码的信息。
接下来载入ida进行分析:
找到main函数,进行伪代码分析:
1.看到第16行代码,输出flag,lpMem中保存着flag值。
2.第8行代码,为lpMen申请内存空间。
3.第9行代码,为lpMem赋值。其中&unk_409B10的值为:
从第13行代码我们知道,第10~15行代码在对lpMem操作,又因为 ExitProcess(0xFFFFFFFF);所以猜测,这段if结构没有执行(执行的话,就会直接退出,不会有跳出MessageBox对话框)
右键查找全部字符串,找到flag:
001110A5 . 6A 02 push 0x2 ; /Style = MB_ABORTRETRYIGNORE|MB_APPLMODAL
001110A7 . 68 20781100 push 00117820 ; |Title = "Flag"
001110AC . FF75 F4 push dword ptr ss:[ebp-0xC] ; |Text
001110AF . 6A 00 push 0x0 ; |hOwner = NULL
001110B1 . FF15 E4601100 call dword ptr ds:[<&USER32.MessageBoxA>>; \MessageBoxA
001110B7 . EB 14 jmp X001110CD
001110B9 > 6A 02 push 0x2 ; /Style = MB_ABORTRETRYIGNORE|MB_APPLMODAL
001110BB . 68 20781100 push 00117820 ; |Title = "Flag"
001110C0 . 8B45 F4 mov eax,dword ptr ss:[ebp-0xC] ; |
001110C3 . 40 inc eax ; |
001110C4 . 50 push eax ; |Text
001110C5 . 6A 00 push 0x0 ; |hOwner = NULL
001110C7 . FF15 E4601100 call dword ptr ds:[<&USER32.MessageBoxA>>; \MessageBoxA
通过设置断点调试,我们可以了解到,if结构和第1个“Flag”处没有执行if结构对应汇编代码:
00111083 . E8 A2FFFFFF call 0011102A
00111088 . 85C0 test eax,eax
0011108A . 75 0A jnz X00111096
0011108C . FF15 14601100 call dword ptr ds:[<&KERNEL32.IsDebugger>; [IsDebuggerPresent
00111092 . 85C0 test eax,eax
00111094 74 23 je X001110B9
00111096 > 41 inc ecx
00111097 . 41 inc ecx
00111098 . 41 inc ecx
00111099 . 41 inc ecx
0011109A . CC int3
0011109B . 8B55 F4 mov edx,dword ptr ss:[ebp-0xC]
0011109E . E8 5DFFFFFF call 00111000
001110A3 . EB 4A jmp X001110EF
在OD修改代码,使得程序执行if结构,再跳转到第二MessageBox处
00111083 . E8 A2FFFFFF call 0011102A
00111088 . 85C0 test eax,eax
0011108A . 75 0A jnz X00111096
0011108C . FF15 14601100 call dword ptr ds:[<&KERNEL32.IsDebugger>; [IsDebuggerPresent
00111092 . 85C0 test eax,eax
00111094 90 nop
00111095 90 nop
00111096 > 41 inc ecx
00111097 . 41 inc ecx
00111098 . 41 inc ecx
00111099 . 41 inc ecx
0011109A 90 nop
0011109B . 8B55 F4 mov edx,dword ptr ss:[ebp-0xC]
0011109E . E8 5DFFFFFF call 00111000
001110A3 EB 14 jmp X001110B9
设置断点,之后调试:
得到flag