0

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 を使用して、次のことを主張しました。

  1. /bin/zshは @0xbffff9b9
  2. system()は @0xb7ed0000
  3. 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

だから私の質問は:

  1. libc 攻撃の概念への回帰を正しく理解できましたか?

  2. 悪意のあるコードを正しい方法と順序でパイプ処理していますか?

  3. GDB では動作するように見えるのに、シェルでは動作しないのはなぜですか?
    (私はすでにgdb で libc への戻りを読みましたが、単独で実行している場合は読みません)

4

0 に答える 0