您好我有以下程序:
int main(int argc, char **argv) {
char *buf1 = (char*)malloc(1024);
char *buf2 = (char*)malloc(1024);
printf("buf1 = %p ; buf2 = %p\n", buf1, buf2);
strcpy(buf1, argv[1]);
free(buf2);
}
输入是:
0000000: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000010: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000020: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000030: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000040: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000050: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000060: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000070: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000080: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000090: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00000a0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00000b0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00000c0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00000d0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00000e0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00000f0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000100: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000110: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000120: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000130: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000140: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000150: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000160: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000170: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000180: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000190: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00001a0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00001b0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00001c0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00001d0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00001e0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00001f0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000200: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000210: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000220: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000230: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000240: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000250: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000260: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000270: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000280: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000290: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00002a0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00002b0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00002c0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00002d0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00002e0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00002f0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000300: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000310: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000320: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000330: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000340: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000350: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000360: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000370: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000380: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
0000390: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00003a0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00003b0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00003c0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00003d0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00003e0: 41414141 41414141 41414141 41414141 AAAAAAAAAAAAAAAA
00003f0: 41414141 ffffffff 42424242 42424242 AAAA....BBBBBBBB
0000400: f8ffffff f0ffffff ffffffff ffffffff ................
0000410: fc9f0408 aab00408
的: - 0x804b0aa:shellcode的地址(现在还没有,但是如果它在那里它也不起作用) - 0x8049ffc:free - 0xc地址(自由函数位于:0804a008) - 0x804b008:指向第一个缓冲区数据的指针 - 0x804b410:指向第二个缓冲区数据的指针
每当我运行程序时,我得到:
buf1 = 0x804b008 ; buf2 = 0x804b410
*** glibc detected *** ./vuln: free(): invalid pointer: 0x0804b410 ***
======= Backtrace: =========
/lib/libc.so.6(+0x6c501)[0x19b501]
/lib/libc.so.6(cfree+0xd6)[0x19fec6]
./vuln[0x80484b4]
/lib/libc.so.6(__libc_start_main+0xe7)[0x145ce7]
./vuln[0x80483c1]
======= Memory map: ========
00110000-0012c000 r-xp 00000000 08:01 268227 /lib/ld-2.12.1.so
0012c000-0012d000 r--p 0001b000 08:01 268227 /lib/ld-2.12.1.so
0012d000-0012e000 rw-p 0001c000 08:01 268227 /lib/ld-2.12.1.so
0012e000-0012f000 r-xp 00000000 00:00 0 [vdso]
0012f000-00286000 r-xp 00000000 08:01 268245 /lib/libc-2.12.1.so
00286000-00288000 r--p 00157000 08:01 268245 /lib/libc-2.12.1.so
00288000-00289000 rw-p 00159000 08:01 268245 /lib/libc-2.12.1.so
00289000-0028c000 rw-p 00000000 00:00 0
0028c000-002a6000 r-xp 00000000 08:01 261718 /lib/libgcc_s.so.1
002a6000-002a7000 r--p 00019000 08:01 261718 /lib/libgcc_s.so.1
002a7000-002a8000 rw-p 0001a000 08:01 261718 /lib/libgcc_s.so.1
08048000-08049000 r-xp 00000000 08:01 149954 /home/eleanor/testing/heap/vuln
08049000-0804a000 r--p 00000000 08:01 149954 /home/eleanor/testing/heap/vuln
0804a000-0804b000 rw-p 00001000 08:01 149954 /home/eleanor/testing/heap/vuln
0804b000-0806c000 rw-p 00000000 00:00 0 [heap]
b7fec000-b7fed000 rw-p 00000000 00:00 0
b7ffd000-b8000000 rw-p 00000000 00:00 0
bffdf000-c0000000 rw-p 00000000 00:00 0 [stack]
Aborted (core dumped)
让我担心,因为堆上的值是正确的。 linux malloc / free是否有可能发生变化,因此不再可能。如果是,我怎样才能实现学习目的?如果不是,那么什么似乎是问题,所以它不起作用?
答案 0 :(得分:0)
每当您尝试了解溢出攻击时,请记住禁用ASLR和Canaries:
root@mfsec # echo 0 > /proc/sys/kernel/randomize_va_space
root@mfsec # gcc vuln.c -o vuln -fno-stack-protector
这应该可以解决问题,如果你不打算很快重启,请记得再次启用ASLR;)