-
-
[原创]第六题 Repwn(缓冲区溢出)
-
发表于: 2019-3-13 09:16 3084
-
通过查找字符串Please Input Your Key_ Now!
,定位输入flag的位置:
查看检测flag的两个函数sub_4012F0((int)&v13)
和sub_401460(&v13)
:
这个函数已经确定第9到20位为X1Y0uN3tG00d
,老版本的程序没有判断第21位,导致有多个解,3月12日下午更新过的程序加上了对21位的判断,这一位是H
。
这个函数判断flag的长度是否为24,如果是的话,调用sub_4013B0(int a1)
,把第1到8位转换成8个数字,判断其是否满足下面的条件:
解出这个三元一次方程,可得flags前8位是20101001
,之后程序会修改flags第21到24位,使用strcpy把flags复制到Dest中造成栈溢出,影响返回值地址。到现在为止,已经推算出了flags的前21位是20101001X1Y0uN3tG00dH
,flags的后4位会修改函数的返回地址(传说中的栈溢出/Stackoverflow)
代码段位置基本都是0x0040****
,又已知flags[20]==0x48
flags[20]-0x58==(-0x10)==0xF0
flags[21]-0x46==__
flags[22]-0x03==0x40
flags[23]-0x6B==0x00
所以除了第22位暂不确定外,程序的flags是:20101001X1Y0uN3tG00dH_Ck
,程序的返回地址是0x0040**F0
,由于代码量比较少,查找调用puts
和printf
的代码段,找到一个可疑的地方0x00401BF0
,这个地方并没有定义函数,也没有函数直接调用这里,所以这应该就是目标返回地址了。
带入计算可得flags[21]=0x46+0x1B='a',所以flags可能是20101001X1Y0uN3tG00dHaCk
,输入程序中,返回Success_Please_Input_The_Flag
。
但是之前搜索字符串时,并没有找到类似Success
的字符串,这是因为这个字符串也被混淆了,执行下面的脚本,可以解密出字符串来。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)