私は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
はgdb
でdisassemble 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
コマンドだと思うが、なぜその命令が必要です?
「uname -a」は何を表示しますか? '/ etc/issue.net'には、' gcc --version'によってどのバージョンのgccが表示されていますか?それは整列に関連するかもしれないように聞こえるかもしれませんが、Linuxがどれほど古いかによって、あなたの古いコンパイラが地元の人々を配置しました。 –
私はパテをインストールできるコンピュータやインターネットに接続されたLinuxマシンにアクセスできないが、今夜見てみよう。 – dippynark
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