ret2shellcode
一、介绍
ret2shellcode是指当数据段中有可写可执行段时,向该段中写入目标函数代码(通常为system('/bin/sh'))。然后通过栈溢出将返回地址改为该代码的头地址,使之执行。
二、ret2shellcode
下面的示例来自ctf-wiki:
https://ctf-wiki.org/pwn/linux/user-mode/stackoverflow/x86/basic-rop/#ret2shellcode
步骤一:checksec检查保护 与 IDA静态分析
得到的有用信息:
- 32位的程序
- 有可执行段
接着,用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
步骤三:实践