バッファオーバーフローのさまざまなスタイルをレビューしていて、なぜそれが発生するのか覚えていない問題が発生しました。Linuxバッファオーバーフロー環境変数
#include <stdio.h>
void func(char *buff){
char buffer[5];
strcpy(buffer, buff);
printf("%s\n", buffer);
}
int main(int argc, char *argv[]){
func(argv[1]);
printf("I'm done!\n");
return 0;
}
プログラムの中核となる概念は非常に簡単です、私はちょうどfunc()
のリターンアドレスを上書きするために、バッファをオーバーフロー:次のようにコードは、私が上のバッファオーバーフローを実行しようとしていますプログラムです。プログラムの<_fini>
である0x0804850c
のようなアドレスを私が与えるとき、それはすべて素晴らしいです。そのアドレスでオーバーフローを実装すると、最終的にプログラムは終了します。I'm done!
を印刷せずに "正常に"終了します。私が今実行している問題は、リターンアドレスを0xbfffd89
にある環境変数のようなものにリダイレクトしようとするときです。
その特定の環境変数にあるシェルコードは、hello
の後にプログラムを終了するだけです。しかし、それは発生しません、プログラムは単に欠陥をsegし、それはそれです。シェルコードはシェルコードをテストするために書いた前のプログラムで動作することが確認されています。誰もが、なぜこれが動作していないか考えている。 Thx
gdbの下で実行すると、segfaultをトリガーするものが表示されます。私の推測:環境変数は、読み取り可能であるが実行可能ではないメモリ領域にあります。@ EugeneMayevski'EldoSCorp:私は、ここでは "シェルコード"はシェルといくつかの外部コマンドを実行するマシンコードの専門用語であると仮定しています。この場合、実際のシェルは実行されていないようです。 – Celada
@Celada環境変数が読み取り専用であるかどうかをGDBを使って調べる方法に関する提案。また、シェルコードについても正しいです。 – Blackninja543
@ EugeneMayevski'EldoSCorp一般に定義されているシェルコードはバイナリのバイトコードです。この場合、私はx86 ASMに欲しいものを書いてシェルコードを生成しました。関数のリターンアドレスをリダイレクトすると、新しい命令セットを含むメモリ領域に命令が送られます。 – Blackninja543