проблема переполнения буфера - PullRequest
1 голос
/ 01 мая 2011

После ссылки на этот сайт я хочу смоделировать простую ошибку переполнения буфера
Моя среда Ubuntu 10.10
версия gcc - 4.4.5
Я также загружаю execstack, чтобы включить исполняемый стек моего файла.
ниже мой код

char code[] = "\x90\x90\x90\x6a\x00\xe8\x39\x07\x00\x00\x90\x90\x90";<
char msg[] = "run !!\n";
int main()
{     
     int *ptr;     
     int i;  
     for(i=1;i<128;i++){     
          ptr = (int *)&ptr + i;
          (*ptr) = (int)code;   
     }    

     return 0;
}

Я использую gcc -fno-stack-protector -g -static -o main.out main.c для компиляции моего исходного кода.
Однако, когда я использую gdb для отладки этого исполняемого файла,
случилось что-то странное.
Вот как выглядит вывод GDB:

(gdb) x/i 0x8048492
   0x8048492 <__libc_start_main+402>:   call   0x8048bd0 <exit>
(gdb) x/5b 0x8048492
0x8048492 <__libc_start_main+402>:  0xe8    0x39    0x07    0x00    0x00
(gdb) x/i 0x80ce02e
   0x80ce02e <code+6>:  call   0x80ce76c <_dlfcn_hooks+44>
(gdb) x/5b 0x80ce02e
0x80ce02e <code+6>: 0xe8    0x39    0x07    0x00    0x00

Кажется, что схема этих двух адресов одинакова, но инструкции различны.
Может ли кто-нибудь помочь мне и объяснить, почему это происходит.
Большое спасибо!

1 Ответ

2 голосов
/ 01 мая 2011

У вас наверняка переполнение буфера, но эта строка

 (*ptr) = (int)code;

хранит адрес кода в каждом месте, а не содержимое кодамассив.

...