整型溢出
整数分为有符号和无符号两类,有符号数以最高位作为符号位,正整数最高位为1,负整数最高位为0,不同类型的整数在内存中有不同的取值范围,unsigned int = 4字节,int = 4字节,当存储的数值超过该类型整数的最大值就会发生溢出。
在一些有符号和无符号转换的过程中最有可能发生整数溢出漏洞。
基于栈的整型溢出
以例子来说明
例1:基于栈的整型溢出利用
https://buuoj.cn/challenges#[BJDCTF%202nd]r2t3
图中的字节应该改为字长
04931856.png)]
v3的字节长度为1 ,所以取值为0-2^8也就是0-255
当v3的取值大于255发生整型溢出时,v3=256实际上时v3=0,v3=257时实际上是v3=1,依次类推。
此题中v3的值是我们输入的buf字符串,后面的if语句会判断它的值,如果在4-8之间才会执行下面的return语句将我们输入的字符传给dest
所以我们将输入的字符长度设置为长度为260-264之间就可以。
dest距离ebp17个字节,所以我们需要在输入的第17+4=21个字节开始输入后门函数的地址,之后再补全字符到长度为260-264之间即可。
脚本如下:
from pwn import *
io=remote('node3.buuoj.cn',25414)
elf=ELF('./r2t3')
system = 0x804858b
payload = (cyclic(17+4)+p32(system)).ljust(262,b'a'</