整数溢出
仅供个人学习参考
原理
先看c语言常见数据类型及其范围
因为数据类型的大小范围是编译器决定的
当程序中的数据超过其数据类型的范围时,会造成数据溢出,其中整数类型的溢出称为整数溢出
以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
其中v3为unsigned int8,范围为0到255(0xff),存在整数溢出,同时strcpy(dest, s)存在栈溢出风险,也存在后门函数
思路:利用整数溢出绕过对v3的检查(使payload长度为260到264),再构造栈溢出ret到后门函数,获取flag
exp如下:
1 | from pwn import * |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.