2017-05-09 7 views
1

私はOverTheWireナルニアのwargameを使って作業しています。私はバッファオーバーフローの解決策の1つを完全には理解していません。スタック制御データとローカル変数の間に余分なスペースがあるのはなぜですか?

次のコードは私を混乱させるものです。

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

int main(int argc, char * argv[]){ 
    char buf[128]; 

    if(argc == 1){ 
     printf("Usage: %s argument\n", argv[0]); 
     exit(1); 
    } 
    strcpy(buf,argv[1]); 
    printf("%s", buf); 

    return 0; 
} 

私のソリューションは、mainのリターンアドレスをオーバーフローするstrcpy機能にチェックを長さの欠如を使用しています。 bufのために確保された128バイトの終わりとスタックフレーム制御データの開始(保存されたebpとリターンアドレス)の間に8バイトの未使用メモリがあります。したがって、私のペイロードは、もともと制御データをオーバーフローさせると考えていたよりも8バイト長くする必要があります(136ではなく144バイト)。スタックカナリアが使用されていません。未使用メモリの8バイトの理由は何ですか?

のuname -a:Linuxのメリンダ4.9.15-x86_64版 - linode81#1 SMP金3月17日午前9時47分36秒EDT 2017 x86_64のx86_64でのx86_64のGNU/Linuxの

のgcc --version:GCC(Ubuntuの4.8。ここで〜14.04.3 4-2ubuntu1)4.8.4

gdbdisassemble mainの出力です:

0x0804845d <+0>:  push %ebp 
    0x0804845e <+1>:  mov %esp,%ebp 
    0x08048460 <+3>:  and $0xfffffff0,%esp 
    0x08048463 <+6>:  sub $0x90,%esp 
    0x08048469 <+12>: cmpl $0x1,0x8(%ebp) 
    0x0804846d <+16>: jne 0x8048490 <main+51> 
    0x0804846f <+18>: mov 0xc(%ebp),%eax 
    0x08048472 <+21>: mov (%eax),%eax 
    0x08048474 <+23>: mov %eax,0x4(%esp) 
    0x08048478 <+27>: movl $0x8048560,(%esp) 
    0x0804847f <+34>: call 0x8048310 <[email protected]> 
    0x08048484 <+39>: movl $0x1,(%esp) 
    0x0804848b <+46>: call 0x8048340 <[email protected]> 
    0x08048490 <+51>: mov 0xc(%ebp),%eax 
    0x08048493 <+54>: add $0x4,%eax 
    0x08048496 <+57>: mov (%eax),%eax 
    0x08048498 <+59>: mov %eax,0x4(%esp) 
    0x0804849c <+63>: lea 0x10(%esp),%eax 
    0x080484a0 <+67>: mov %eax,(%esp) 
    0x080484a3 <+70>: call 0x8048320 <[email protected]> 
    0x080484a8 <+75>: lea 0x10(%esp),%eax 
    0x080484ac <+79>: mov %eax,0x4(%esp) 
    0x080484b0 <+83>: movl $0x8048574,(%esp) 
    0x080484b7 <+90>: call 0x8048310 <[email protected]> 
    0x080484bc <+95>: mov $0x0,%eax 
    0x080484c1 <+100>: leave 
    0x080484c2 <+101>: ret 

だから私はそれが余分なスペースを引き起こしているand $0xfffffff0,%espコマンドだと思うが、なぜその命令が必要です?

+0

「uname -a」は何を表示しますか? '/ etc/issue.net'には、' gcc --version'によってどのバージョンのgccが表示されていますか?それは整列に関連するかもしれないように聞こえるかもしれませんが、Linuxがどれほど古いかによって、あなたの古いコンパイラが地元の人々を配置しました。 –

+0

私はパテをインストールできるコンピュータやインターネットに接続されたLinuxマシンにアクセスできないが、今夜見てみよう。 – dippynark

+0

uname -a:Linux melinda 4.9.15-x86_64-linode81#1 SMP Fri Mar 17 09:47 :36 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux – dippynark

答えて

-1

メモリアラインメントのために発生します。

+0

詳細を教えてください。 – kuzyn

関連する問題