переполнение кучи - проблема с ошибкой сегментации - PullRequest
1 голос
/ 22 февраля 2011

Привет, у меня есть следующая программа:

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 есть изменения, так что это больше невозможно. Если да, как я могу сделать это в учебных целях? Если нет, то в чем проблема, так что она не работает?

1 Ответ

0 голосов
/ 03 марта 2011

Всякий раз, когда вы пытаетесь узнать об использовании переполнения, не забудьте отключить ASLR и Canaries:

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

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

Это должно сработать, не забудьте снова включить ASLR, если вы не собираетесь перезагружаться в ближайшее время;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...