Linux 堆溢出-分段错误问题

Linux 堆溢出-分段错误问题,linux,debugging,Linux,Debugging,嗨,我有以下节目: 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

嗨,我有以下节目:

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:外壳代码的地址,它还不在那里,但如果它在那里,它也不起作用 -0x8049ffc:空闲-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是否有可能发生更改,因此不再可能发生这种情况。如果是,我如何才能使之成为学习目的?如果没有,那么问题似乎是什么,所以它不起作用?

每当您试图了解溢出攻击时,请记住禁用ASLR和Canaris:

root@mfsec # echo 0 > /proc/sys/kernel/randomize_va_space

root@mfsec # gcc vuln.c -o vuln -fno-stack-protector

如果你不打算很快重新启动,记得再次启用ASLR

嗨,我当然知道ASLR,当然我禁用了所有的保护机制,所以问题仍然悬而未决。