首页
社区
课程
招聘
[原创] KCTF 2024 第十题 试探 WP
发表于: 2024-9-4 23:35 3139

[原创] KCTF 2024 第十题 试探 WP

2024-9-4 23:35
3139

丢进IDA查看main函数,有一些简单的字符串加密
逐步断点,调用了以下函数
ntdll.dll
NtAddBootEntry
TpAllocWait
TpSetWait
猜测为shellcode注入,简单分析下main函数逻辑

图片描述
18DB处的逻辑,将kctf + input + 6050处的一块shellcode拷贝到75C0
之后创建2个线程,线程A执行shellcode, 线程B等待答案并输出结果ok!或no!

下面重点分析这串shellcode
图片描述

选中140006050,使用IDA-->Edit-->Code转换为代码
这时候我们是不能F5的,因为作者做了混淆

混淆分为2部分

图片描述

图片描述

经过分析发现无效指令特征码只有这三种
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? FD EB 1F 3E 1C EB EB
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? FF EB 15 3E 1D EB FB
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? FE EB 18 3E 1C EB EB

直接丢给GPT写个去混淆的python脚本

1.py,将无关跳转和无效指令替换为nop

2.py,将0x2A还原成0x00

图片描述
图片描述

图片描述
图片描述
图片描述

原始棋盘状态
0 1 3
5 2 6
4 7 8

终点棋盘状态
1 2 3
4 5 6
7 8 0

原始
0 1 3
5 2 6
4 7 8
第一步往右(索引:1),0和1交换,变化为
1 0 3
5 2 6
4 7 8
第二步往下(索引:4),0和2交换,变化为
1 2 3
5 0 6
4 7 8
第三步往左(索引:3),0和5交换,变化为
1 2 3
0 5 6
4 7 8
第四步往下(索引:6),0和4交换,变化为
1 2 3
4 5 6
0 7 8
第五步往右(索引:7),0和7交换,变化为
1 2 3
4 5 6
7 0 8
第六步往右(索引:8),0和8交换,变化为
1 2 3
4 5 6
7 8 0

图片描述

# -*- coding: gbk -*-
 
def replace_bytes_and_preceding(file_path, search_bytes, replace_byte, preceding_length):
    # 读取二进制文件内容
    with open(file_path, 'rb') as file:
        data = file.read()
 
    # 将要查找的字节和替换的字节转换为字节类型
    search_bytes = bytes.fromhex(search_bytes)
    replace_byte = bytes.fromhex(replace_byte)
    replace_length = len(search_bytes) + preceding_length  # 替换的总长度
 
    # 创建一个可变字节数组来进行操作
    modified_data = bytearray(data)
 
    # 初始化搜索开始位置
    start = 0
 
    while start < len(modified_data):
        # 查找字节序列的位置
        index = modified_data.find(search_bytes, start)
        if index == -1:
            break
         
        # 计算需要替换的起始位置
        replace_start = max(0, index - preceding_length)
 
        # 将替换的范围全部设置为 `replace_byte`
        modified_data[replace_start:index + len(search_bytes)] = replace_byte * replace_length
         
        # 更新搜索开始位置,跳过当前替换的位置
        start = index + len(search_bytes)
 
    # 将修改后的数据写回到文件中
    with open(file_path, 'wb') as file:
        file.write(modified_data)
 
    print(f"Replaced all occurrences of {search_bytes.hex()} and preceding {preceding_length} bytes with {replace_byte.hex()} in {file_path}.")
 
preceding_length = 11  # 替换之前的字节数
 
replace_bytes_and_preceding('test3.exe', 'FD EB 1F 3E 1C EB EB', '90', preceding_length)
replace_bytes_and_preceding('test3.exe', 'FF EB 15 3E 1D EB FB', '90', preceding_length)
replace_bytes_and_preceding('test3.exe', 'FE EB 18 3E 1C EB EB', '90', preceding_length)
# -*- coding: gbk -*-
 
def replace_bytes_and_preceding(file_path, search_bytes, replace_byte, preceding_length):
    # 读取二进制文件内容
    with open(file_path, 'rb') as file:
        data = file.read()
 
    # 将要查找的字节和替换的字节转换为字节类型
    search_bytes = bytes.fromhex(search_bytes)
    replace_byte = bytes.fromhex(replace_byte)
    replace_length = len(search_bytes) + preceding_length  # 替换的总长度
 
    # 创建一个可变字节数组来进行操作
    modified_data = bytearray(data)
 
    # 初始化搜索开始位置
    start = 0
 
    while start < len(modified_data):
        # 查找字节序列的位置
        index = modified_data.find(search_bytes, start)
        if index == -1:
            break
         
        # 计算需要替换的起始位置
        replace_start = max(0, index - preceding_length)
 
        # 将替换的范围全部设置为 `replace_byte`
        modified_data[replace_start:index + len(search_bytes)] = replace_byte * replace_length
         
        # 更新搜索开始位置,跳过当前替换的位置
        start = index + len(search_bytes)
 
    # 将修改后的数据写回到文件中
    with open(file_path, 'wb') as file:
        file.write(modified_data)

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2024-9-4 23:53 被wx_孤城编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//