首页
社区
课程
招聘
[原创]reversing.kr上一道很有意思的crackme replace分析
发表于: 2017-10-22 19:06 4728

[原创]reversing.kr上一道很有意思的crackme replace分析

2017-10-22 19:06
4728

随便输入个数,发现崩溃了

PEID查发现没壳,IDA找到dialogproc,F5发现IDA报错

代码逻辑前面就是GetDlgItemInt获取输入,(所以输入必须要是整形
看下后面,得知错误原因很简单,sub_40466F是个函数,但是程序在运行的时候对他进行了动态修改,所以IDA认为这个程序对const进行了修改
运行时改变代码,好,那就OD看下

这里[0x4084d0]就是input,是个全局变量,
跟进call,

这里看到了sub_404689,功能很简单,把input+=1,这个函数在dialogfunc那里也有调用
F7走起,

再F7,

注意eip的地址,第二张图eip的位置其实就在第一张eip的位置的后面一点
然后调用inc input的那个函数,返回之后又会inc一次,这个不好说,大家自己跟一下就知道了。。。

inc完两次之后如图所示,注意栈上的返回地址,所以再F7之后,

到了这个地方,就是把input增加0x601605c7,可能会溢出,但是无所谓,取余一下就好
下面一点指令貌似没什么用,因为没对input有什么影响,走到下面的call,又会inc input两次,最后retn会返回到dialogproc

所以这个函数在被后面的指令修改之前,干了一件事,把input +2 + 0x601605c7 +2
确认一下,我输入的是20192019,所以
>>> hex(20192019+2+2+0x601605c7)
'0x614a20de'
如数据窗口所示,数是反过来的是因为little endian

返回那个函数(change_f)之后(在xor eax,eax那里),被修改过的input被mov到了eax中,然后又调用一次inc_input,然后修改change_f函数的函数头,在call change_f那里F7进去,发现汇编被修改成了

[eax]=0x90,注意此时eax的值,其实就是 input +2 + 0x601605c7 +2 ,所以随便输一个数会崩溃,因为访问了无效的内存地址
返回后inc eax,然后再调用一次被修改后的change_f
0x90,是不是很熟悉?没错,就是nop,再看看IDA的代码,有一个疑似成功的代码段
但是没有任何jmp之类的跳转到这里,空格看看,上面有个jmp short(刚好两个字节),

很明显了,这道题就是要通过这个mov byte ds:[eax], 0x90来nop掉那个jmp short,所以 input + 2 + 0x601605c7 + 2 = 那个jmp short的地址。
考虑到整数溢出,所以用C,
//input + 2 + 0x601605c7 + 2 == 0x00401071

unsigned int getinput()
{
    return 0x00401071/*jmp short 地址*/ - 4 - 0x601605c7;
}

int main()
{
    printf("%u\n", getinput());
    system("pause");
}//*/

一个思路比较新奇的CM,利用nop爆破的题目,不难,但是比较有意思,发帖纪录一下



[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 1
支持
分享
最新回复 (5)
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好!
2017-10-22 21:17
0
雪    币: 24303
活跃值: (5304)
能力值: ( LV12,RANK:529 )
在线值:
发帖
回帖
粉丝
3
为什么我的od在地址404674处显示的是db  81,不是那个add指令,这个是怎么修改的
2017-10-23 17:47
0
雪    币: 5676
活跃值: (1303)
能力值: ( LV17,RANK:1185 )
在线值:
发帖
回帖
粉丝
4
会飞的鱼油 为什么我的od在地址404674处显示的是db 81,不是那个add指令,这个是怎么修改的
我是先把这个字节和后面的一些指令nop掉,再撤销修改。。。可能有更好的办法。。
2017-10-23 18:09
0
雪    币: 1432
活跃值: (3067)
能力值: ( LV9,RANK:156 )
在线值:
发帖
回帖
粉丝
5
会飞的鱼油 为什么我的od在地址404674处显示的是db 81,不是那个add指令,这个是怎么修改的
右键,从模块中删除分析。
2017-10-23 20:34
0
雪    币: 20
活跃值: (30)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
机智的nop填充
2017-10-25 22:35
0
游客
登录 | 注册 方可回帖
返回
//