ret2shellcode

一、介绍

       ret2shellcode是指当数据段中有可写可执行段时,向该段中写入目标函数代码(通常为system('/bin/sh'))。然后通过栈溢出将返回地址改为该代码的头地址,使之执行。

二、ret2shellcode

下面的示例来自ctf-wiki:

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

步骤一:checksec检查保护 与  IDA静态分析

 

 

 得到的有用信息:

  1. 32位的程序
  2. 有可执行段

接着,用32位的IDA打开程序:

 

 

 按F5打开源代码界面,代码大概的操作就是:输入一个字符串给地址为v4处,然后用strncpy函数将该字符串赋给buf2。为了获得更多信息,我们应该跟进一下buf2。

 

 buf2是位于.bss段的,想到上面checksec检测到有可写可执行段,如果.bss段就是这个可写可执行段的化,我们就可以把shellcode写入进去,再使栈溢出将返回地址覆盖成.bss中的shellcode开始,然后就可以返回到这里进行执行获得sh。

步骤二:验证想法 与 相关准备

使用gdb调试打开该文件,然后执行 vmmap命令查看各段信息:

 

 上面已经知道buf2是第一个元素的头地址是0x0804A080,又知在该段是可写可执行的(rwxp),所以该方法是可行的。

 因为在这里是要使程序执行完strncpy后才可以进行溢出到.bss,不然,shellcode还没传到.bss。所以输入数据后,断在strncpy计算溢出长度。

 

 计算:0xd038 - 0xcfcc = 0x6c = 108  然后算上ebp的4字节是112 最后加上bss的地址就可以了。

复制代码
准备:
//获得shellcode并进行编译
shellcode = asm(shellcraft.sh())

//buf2处的地址
bss_addr = 0x0804A080

//溢出长度
112
复制代码

步骤三:实践

 

posted @ 2022-03-13 21:36  tolele  阅读(638)  评论(0编辑  收藏  举报