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

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

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

程序会从当前目录下把文件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

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

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