首页
社区
课程
招聘
[原创]第2阶段第1题提交
发表于: 2007-8-28 15:03 8048

[原创]第2阶段第1题提交

2007-8-28 15:03
8048
简单说明:

程序会从当前目录下把文件test.txt的内容读到VirtualAlloc的内存M中去。
然后执行以下步骤。
1:
前8个字节为一个UINT64的数A。 通过运算函数 sub_4005C0 sub_400540,
得到另一个UINT64的值B.
计算有  B = ((A * 0x78CC02A869948F1B) % 0x5BE6FF82A5164785  ) & 0xffffffff  
2:
把A转换成(BYTE *)后, 通过下列运算
for(int i=0; i<4; ++i)
{
   A[i*2] ^= 0x1c;
   A[i*2+1] ^= A[i*2];
}
3:
接着, 从M开始中往堆栈拷贝 ( (26-B)*B-156 )  *4个字节到堆栈中。

显然, 3是Exploit的关键。
当(26-B)*B-156 = 13的时候刚好覆盖返回值, 解2元方程得到B=13
于是有 ( ((A * 0x78CC02A869948F1B) % 0x5BE6FF82A5164785  ) & 0xffffffff  ) == 13
做个小程序算出一些值来, 有A=3D6365D6,EFF333B5,8AD397F7 。。。。
把A代入到步骤2运算, 第一个数3D6365D6生成的不是有效指令
第2个数, 是test eax, sub eax,什么的。 显然不会对程序造成影响。
就用它了!
注意, 生成的指令缺一个字节, 所以需要在buf中多补一个字节, 比如00

4:
在调用这个Exploit函数时候, 第一个参数就是M! 所以我们可以覆盖返回值为一个ret指令的地址。
随便在exe中找一个, 这样, 函数返回的时候, 就会跑到ret指令上, ret指令在ret一次, 就到了
M。 M刚开始的9个字节可以忽略, 下面就是构造代码了。
很简单, 让MessageBox的2个字符串的值改掉。 然后调整ebp, 调整esp, 设置新的eip, go。
一切ok。

这种方式能运行在任何系统上, 总文件长度为52字节。 具体的代码参考附件test.txt

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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 47147
活跃值: (20410)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
测试通过,恭喜~
2007-8-28 15:11
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
3
可是少了一个感叹号. 本来想再提交一次的. 既然通过了.... 呵呵
2007-8-28 15:19
0
雪    币: 47147
活跃值: (20410)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
我没注意到那个感叹号,麻烦你再次提交一次,呵~
2007-8-28 15:22
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
5
早知道不说了.. 那时间怎么算?
2007-8-28 17:16
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
6
上传的附件:
2007-8-28 17:18
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
7
验证通过~~
2007-8-28 17:49
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
8
136.47658816920911314092574818832
2007-9-2 21:35
0
游客
登录 | 注册 方可回帖
返回
//