次の簡単なコードを使用して、libc トリックに戻ろうとしています。
#define SYSTEM_CALL_ADDR 0xb7ec5e50 /*my system call addr*/
#define EXIT_CALL_ADDR 0xb7ebbb80 /*my exit call addr*/
char shell[] = "/bin/sh";
int main(){
int* p;
p = (int*)&p + 2;
*p = SYSTEM_CALL_ADDR;
p = (int*)&p + 3;
*p = EXIT_CALL_ADDR;
p = (int*)&p + 4;
*p = shell;
return 1;
}
興味深いことに、このプログラムを実行すると「セグメンテーション エラー」で終了しますが、gdb を使用してデバッグし、段階的に実行すると、まったく問題なく、シェルが生成されてからプログラムが終了します。誰でもこの状況に遭遇しますか?または、誰かがこれを修正する方法を教えてもらえますか? まず感謝します。私は ArchLinux カーネル:2.6.33、gcc 4.5.0 を使用しています。