-
-
[原创]第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期)