[BUUCTF]PWN12——[BJDCTF 2nd]r2t3

[BUUCTF]PWN12——[BJDCTF 2nd]r2t3

题目网址:https://buuoj.cn/challenges#[BJDCTF%202nd]r2t3

步骤:
例行检查,32位,开启了NX保护
在这里插入图片描述
nc一下看看程序的大概执行情况
在这里插入图片描述
32位ida载入,shift+f12查看程序里的字符串,看到了system函数和 ‘/bin/sh’ 字符串
在这里插入图片描述
双击跟进,ctrl+x找到调用改字符串的函数,找到了程序里的一个后门函数,shell_addr=0x804858B
在这里插入图片描述
根据nc得到的提示字符串,找到输入点,第10行的read对读入的buf进行了限制,没法造成溢出
在这里插入图片描述
看一下name_check函数,改函数检查了我们输入的字符串的长度,长度得要在4~7之间
在这里插入图片描述
这边注意一下,用来表示字符串长度的参数v3,它定义的类型是unsigned_int8(无符号整型),它所能表示的数的范围是0~2^8-1(255),而我们读入的字符串buf的最大长度是0x400(1024),1024超过了v3所能表示的范围,所以 这里存在整数溢出漏洞,关于整数溢出的具体讲解–>看这里

关于strlen()这个函数,上述链接里也有提到,如果参数的长度大于了它的固定的长度,就会将前面的扔掉,留下剩下的
举个例子:a的长度为260,b也是定义的unsigned_int8,因此b=strlen(a)=260-255=5
我们就可以利用strlen函数的这一点来绕过长度的检查,根据上述,我们可以用来绕过长度检查的字符串的长度应该是255+4(259) ~ 255+7(262)

这边提一下shell_addr=0x804858B,它的长度是4字节,0x08、0x04、0x85、0x8B,从后往前,两位一字节,不足补0

在我们通过长度检查之后,13行会将我们输入的字符串赋值到dest中,看一下dest在栈上的位置
在这里插入图片描述
在这里看到了它在栈上的位置,它距离返回地址r=0x4-(-0x11)=0x15,因此我们在构造输入字符串的时候可以先输入0x15个a用来定位到返回地址,然后将返回地址填上shell_addr,之后补上(260-0x15-4)个长度的a来绕过长度检查

完整EXP

from pwn import*

r=remote('node3.buuoj.cn',25177)
shell_addr=0x804858B

payload='a'*0x15+p32(shell_addr)+'a'*(260-0x15-4)

r.sendline(payload)
r.interactive()

在这里插入图片描述

原文地址:https://www.cnblogs.com/xlrp/p/14273722.html