9

私はこのようなプログラムを持っています:

/* buf_overflow.c */
#include <stdio.h>
int main(){
    char buf[4];
    char exploit_buf[4];
    fgets(buf, 4, stdin);
    gets(exploit_buf);
    printf("exploit_buf: %s\n", exploit_buf);
    return 0;
}

「gets」関数の脆弱性を使用して、他のいくつかの変数をバッファオーバーフローさせます。「exploit_buf」に書き込みたい値は「AAAAAAAA\x01 \ x00 \ x00 \ x00」ですが、ASCIIコード「01」と「00」をexploit_bufに送信する方法がわかりません。

このコマンド「printf"AAAAAAAA\ x01 \ x00 \ x00 \ x00"」を使用すると、必要な文字を入力できることは知っていますが、それらをexploit_bufに送信する方法がわかりません。Alt +(キーボードの右側にある数字キー)が入力したASCIIコードから文字を生成できることも知っていますが、これは私のプログラムでも機能しません。

主な問題は、「最初の関数「fgets()」をスキップして、「gets()」に任意のASCIIコードを入力するにはどうすればよいですか」です。

Linuxのコマンドラインで任意のASCIIコードを入力する方法を知っている人はいますか?

4

4 に答える 4

15

使用できますecho -e

$ echo -ne 'AAAAAAAA\x01\x00\x00\x00' | python -c 'import sys; print repr(sys.stdin.read())'
'AAAAAAAA\x01\x00\x00\x00'

-eechoエスケープコードの解釈を許可し-n、末尾の改行を抑制します。

Python プログラムは、受信した内容の文字列表現を出力することに注意してください。これは、 を使用して送信したものとまったく同じechoです。

より複雑なエクスプロイト文字列の場合、単純に Perl または Python を使用してエクスプロイト文字列を直接構築することも珍しくありません。

$ perl -e 'print "A" x 1024 . "\0\0\0\1"' | ./buf_overflow
于 2013-03-09T07:07:15.733 に答える
9

ターミナルで次のコマンドを入力します。

echo $'\000\001' > file1

これにより、ASCII 文字 1 と ASCII 文字 2 の値が file1 という名前のファイルに保存されます。これで、これをバッファエクスプロイト_buf に読み込むことができます。

于 2013-03-09T07:15:23.437 に答える
0

nneonneo の素晴らしい例です。

ただし、スクリプトの助けを借りずに直接入力したい場合は、キーボード設定を変更して「USA International (AltGr dead keys)」モードを使用することができます (System -> Preferences -> Keyboard -> Layout の下)。右の Alt ボタンを使用して、特殊記号を簡単に作成できます。例 - é は rAlt+e です。° は rAlt-shift-0-0 です (他のボタンを押しながら 0 を 2 回押します)。

于 2013-03-09T07:11:46.137 に答える
0

標準入力から入力を取得しているだけなので、出力をパイプするだけですprintf

printf 'whatever' | myprogram
于 2013-03-09T08:45:08.953 に答える