xctf csaw2013reversing2

先运行此程序:
在这里插入图片描述窗口只认识一个 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值