-
-
[原创]Boneasher 答题
-
发表于:
2007-8-28 22:04
7989
-
第二阶段第一题
简要分析:
1。首先发现程序会读取test.txt的内容进行处理
2。test.txt开始的2个DWORD会当成64位整数(记为d1)参与一个乘法和mod运算
并且当其结果满足(26-x)x-156 >0是会有一个内存拷贝动作,进一步分析发现x=13的时候会有溢出且刚好能覆盖返回地址
3。上面的64位运算即 x = d1 * ( 78CC02A869948F1B ) % 5BE6FF82A5164785
考虑到截位则
x = (d1* 78CC02A869948F1B %10000000000000000) % 5BE6FF82A5164785
等价于
(d1* 78CC02A869948F1B %10000000000000000) = x 或者 5BE6FF82A5164785 + x + 2*5BE6FF82A5164785+x
4。分别对上面三种情况用欧几里德算法得到d1可以为 7590C53F8AD397F7 , 704DA9F23D6365D6或者6B0A8EA4EFF333B5
5。尝试之后发现用6B0A8EA4EFF333B5可以使溢出代码长度较小。
溢出代码构造:
返回地址选为 4005C0,运行后跳到保存文件内容的地方继续运行,中间插入修改Failed!为OK!的代码以及一些堆栈修复代码,然后返回到400383继续运行。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!