整数型溢出

参考xctf的一道整数型溢出
整数溢出三种类型:
1、溢出
只有有符号数才会发生溢出。有符号数最高位表示符号,在两正或两负相加时,有可能改变符号位的值,产生溢出。
溢出标志 OF 可检测有符号数的溢出。
2、回绕
无符号数 0-1 时会变成最大的数,如 1 字节的无符号数会变为 255,而 255+1 会变成最小数 0。
进位标志 CF 可检测无符号数的回绕。
3、截断
将一个较大宽度的数存入一个宽度小的操作数中,高位发生截断。
参考下图的回绕可有助于了解
在这里插入图片描述

xctf的这道int_overflow就是利用了回绕
PS:具体图片网上都有,就懒得截图了。
观察ida的login函数可以看到用来表示密码变量的buf设置的长度极长,这就提供了回绕的空间;
在check_passwd函数中更是发现了传递buf变量值的S变量是无符号整型,基本确定是回绕,ida中显示判断条件为3到8,所以构造字节大小应为(256+3)~(256+8),且S覆盖到的dest变量的长度为0x14;
在整体观察函数时,发现一个get_flag函数,于是利用这个函数的返回地址构造payload;
PS:get_flag的返回地址不是command那个,而是在该函数的上层函数what_is_this里面的一个返回地址。
在观察这个地址时还发现了leave(出栈),所以要在溢出时多分配四个字节,所以构造payload为**'a’0x14+'a’4+p32(get_flag address)+‘a’(256+(3~8) - 0x14 - 4 - 4)**。

发布了2 篇原创文章 · 获赞 1 · 访问量 87

猜你喜欢

转载自blog.csdn.net/weixin_45999107/article/details/103971822