攻防世界int_overflow
整数溢出原理

对于 unsigned short int 类型的两个变量 var1、var2,假定取值 var1 = 1,var2 =65537(二进制为0001,0000,0000,0000,0001),在比较这两个值时,会仅考虑后16个字节的内容,故相等。
check一下,32位程序
看看主函数,emm没啥

进入登陆函数
进入check,留意到危险函数strcpy,这个函数是字符串copy的,意思就是把s覆盖dest上,但是如果s的长度足够长将会导致dest溢出从而导致修改返回地址从而到达后门函数。

可见函数中v3为8字节短整型,存在整形溢出,下面判断中对输入的密码的长度有要求,要在4到8之间(端点处可以取到),考虑到整形溢出,长度可在0001,0000,0100(二进制)到0001,0000,0111(二进制)之间,换算后即为260到264之间.具体用途还需要往下看。
找到system函数,地址,what_is_this .text 0804868B

进入dest,长度为0x14。strcpy函数将这么长的s复制给远没有那么大的dest,造成栈溢出。
综上,我们写入的密码为261个字符,其中0x14覆盖dest的长度,4个字符覆盖栈中的s,然后根上返回地址(system的),然后system的返回地址用p32(0)代替。完成!


浙公网安备 33010602011771号