组长 | 组员 | 组员 |
---|---|---|
E41714007 | E41714001 | E41714020 |
1 题目要求
在下面网址的题目中选一题做,交一份题解
http://reversing.kr/challenge.php
我们组选择的是Replace
2 解题过程
2.1 注册账号
注册成功后会收到邮件
2.2 下载需要的资料
点击题目,下载好压缩包后解压,可以看到以下文件
2.3 正式开始解题
双击运行可执行程序
尝试输入,发现在文本框中输入限制只允许输入数字,其余长度什么均没有限制,不输入点击Check,程序会报错。
经过查壳检查,发现该程序没有壳。随后使用IDA shift+F12
显示所有的字符串。很明显会看到一个correct
。
双击correct来到数据位置,按下ctrl+X
交叉引用显示调用位置
查看整体结构框架。按下空格键
,会看到程序的整体流程图。
使用ollydbg动态调试, 根据在IDA中的相应位置,在OD中定位。ASCII表示的就是correct。
在下列位置设置断点,按F2
键
首先要找到输入的位置,找到getdlgitemText
函数,下断点。
按F9
运行程序。输入数字123,断在0040104c
处。
往下看,圈红的地方就是我们想要到达的地方,可是有两个jmp,这意思是怎么也不会跳到00401073
这个位置了。在流程图中这个地方是断开的,没有任何地方显示它的跳转来源。
接着往下走,这个地方就出现了问题,程序报错了。
双击该语句,跳转来到下面这个语句
按Ctrl+F2
重新开始,这次运行不输入任何数据,发现程序运行到00400466F
就终止了
因此可以知道,导致程序终止的原因就在这,它的功能是把90(也就是nop)赋值给eax中的地址。再返回
在004046a9
设置断点,再看下当运行到004046a9时eax的数据,输入的是12,显示的eax=601605D7
.
输入的是1234,显示的eax=60160A9D
601605d7-C=601605CB
60160a9d-4c2=601605CB
可以发现有一个相同的数据601605cb
。
可以看004046c4
这个跳转是向上跳的,可知401071的地址是jmp。
假如是一个nop是不是就可以往下执行那个显示correct。那么怎么让程序修改它的数据为nop呢? 0040466f中正是实现这个功能。
但有两个call 0040466f。中间还对eax自增了1
可以看到00401071有数据,但00401072却不显示,这个功能就是让00401072也为nop。
所以这个程序的大体流程如下:0x601605cb+一个值=0x100401071
因此可以分析出程序的大概流程:
- 输入数据,然后程序运行到00401071,跳转到4046a9,eax=0x601605cb+输入的数据,这个值必须要等于0x00401071。然后这个eax值(0040466F $C600 90 mov byte ptr ds:[eax],0x90)也就是该中的eax值,程序会把eax也就是00401071中的指令修改为nop
- 运行到004046AE。eax+1=00401072,在运行到004046af程序会把eax也就是00401071中的指令修改为nop
- 运行到004046c4,跳转到00401071
根据分析,确定输入的数字为2687109798
重新运行程序,输入数据,最后你会发现如下变化
00401071变成了nop命令,同时00401072也显示出来,为nop命令
而且寄存器EAX的值变为FFFFFFFF,对话窗口显示correct!