逆向攻防世界CTF系列41-EASYHOOK

逆向攻防世界CTF系列41-EASYHOOK

看题目是一个Hook类型的,第一次接触,虽然学过相关理论,可以看我的文章

Hook入门(逆向)-CSDN博客

题解参考:https://www.cnblogs.com/c10udlnk/p/14214057.html和攻防世界逆向高手题之EASYHOOK-CSDN博客

int __cdecl main(int argc, const char **argv, const char **envp){HANDLE FileA; // eaxDWORD NumberOfBytesWritten; // [esp+4h] [ebp-24h] BYREFchar Buffer[32]; // [esp+8h] [ebp-20h] BYREFsub_401370(aPleaseInputFla);scanf("%31s", Buffer);if ( strlen(Buffer) == 19 ){sub_401220();// 创建文件 (文件名,表示文件以写入模式打开,文件不允许共享访问(即独占模式),不设置安全属性,创建新文件,文件属性设置为普通		文件,模板文件)FileA = CreateFileA(FileName, 0x40000000u, 0, 0, 2u, 0x80u, 0);// (文件句柄:表示目标文件,写入的数据,表示写入的字节数,写入的实际字节数存储位置,同步写入[不使用异步操作])WriteFile(FileA, Buffer, 0x13u, &NumberOfBytesWritten, 0);sub_401240(Buffer, &NumberOfBytesWritten);// 验证函数if ( NumberOfBytesWritten == 1 )sub_401370(aRightFlagIsYou);elsesub_401370(aWrong);system(Command);return 0;}else{sub_401370(aWrong);system(Command);return 0;}
}

跟进401240

int __cdecl sub_401240(const char *a1, _DWORD *a2)
{int result; // eaxunsigned int v3; // kr04_4char v4[24]; // [esp+Ch] [ebp-18h] BYREFresult = 0;strcpy(v4, "This_is_not_the_flag");v3 = strlen(a1) + 1;if ( (int)(v3 - 1) > 0 ){while ( v4[a1 - v4 + result] == v4[result] ){if ( ++result >= (int)(v3 - 1) ){if ( result == 21 ){result = (int)a2;*a2 = 1;}return result;}}}return result;
}

v4[a1 - v4 + result] == v4[result]??,完全不通啊

还看了汇编源码,没看懂 0.0

看下sub_401220先

int sub_401220()
{HMODULE LibraryA; // eaxDWORD CurrentProcessId; // eax// 1. 获取当前进程句柄// GetCurrentProcessId:获取当前进程的进程 ID。// OpenProcess:使用当前进程 ID,以 0x1F0FFFu 权限打开当前进程CurrentProcessId = GetCurrentProcessId();hProcess = OpenProcess(0x1F0FFFu, 0, CurrentProcessId);// 2. 加载目标库和获取函数地址// 动态加载一个DLL文件。// 成功后返回该库的模块句柄 LibraryA。// GetProcAddress:从 LibraryA 中获取目标函数(ProcName)的地址,存储到 WriteFile_0。函数签名定义为 BOOL WriteFile(...)。LibraryA = LoadLibraryA(LibFileName);WriteFile_0 = (BOOL (__stdcall *)(HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED))GetProcAddress(LibraryA, ProcName);// 3. 检查函数是否获取成功lpAddress = WriteFile_0;if ( !WriteFile_0 )return sub_401370((int)aApi);// 4. 保存原函数的前几字节// 将 WriteFile_0 的前 5 字节保存到 unk_40C9B4 中。_DWORD:前 4 字节。_BYTE:第 5 字节。unk_40C9B4 = *(_DWORD *)lpAddress;*((_BYTE *)&unk_40C9B4 + 4) = *((_BYTE *)lpAddress + 4);// 5. 计算跳转偏移量// byte_40C9BC = -23:一个额外的字节赋值(可能和跳转相关)// 计算一个偏移量,用于跳转到 sub_401080。byte_40C9BC = -23;dword_40C9BD = (char *)sub_401080 - (char *)lpAddress - 5;return sub_4010D0();
}

这里犯了个错,不是-23而是0XE9,是JMP的机器码指令

image-20241118215218470

byte_40C9BC和dword_40C9BD是相邻的,连起来就是 jmp xxxx四个字节

偏移地址=目标地址-当前地址-5(jmp和其后四位地址共占5个字节)。所以前面直接用E9,这里直接用偏移地址就省去编译生成机器码那一步。

看看sub_4010D0()

BOOL sub_4010D0()
{DWORD v1; // [esp+4h] [ebp-8h] BYREFDWORD flOldProtect; // [esp+8h] [ebp-4h] BYREFv1 = 0;// hProcess:目标进程的句柄。// lpAddress:目标内存地址// 5u:操作的字节数。// 4u:新的内存保护属性(可读写)。// &flOldProtect:存储原始内存保护属性。VirtualProtectEx(hProcess, lpAddress, 5u, 4u, &flOldProtect);//  byte_40C9BC 的内容写入目标进程中 lpAddress 开始的 5 字节区域WriteProcessMemory(hProcess, lpAddress, &byte_40C9BC, 5u, 0);return VirtualProtectEx(hProcess, lpAddress, 5u, flOldProtect, &v1);
}

jmp那里会跳转到目标地址sub_401080处,双击跟踪该函数:

int __stdcall sub_401080(HANDLE hFile,LPCVOID lpBuffer,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,LPOVERLAPPED lpOverlapped)
{int v5; // ebxv5 = sub_401000(lpBuffer, nNumberOfBytesToWrite);sub_401140();WriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped);if ( v5 )*lpNumberOfBytesWritten = 1;// 这里才是真正的校验结果的验证return 0;
}

sub_401000();才是真正的加密函数

BOOL sub_401140()
{DWORD v1; // [esp+4h] [ebp-8h] BYREFDWORD flOldProtect; // [esp+8h] [ebp-4h] BYREFv1 = 0;VirtualProtectEx(hProcess, lpAddress, 5u, 4u, &flOldProtect);WriteProcessMemory(hProcess, lpAddress, &unk_40C9B4, 5u, 0);return VirtualProtectEx(hProcess, lpAddress, 5u, flOldProtect, &v1);
}
int __cdecl sub_401000(int a1, int a2)
{char i; // alchar v3; // blchar v4; // clint v5; // eaxfor ( i = 0; i < a2; ++i ){if ( i == 18 ){*(_BYTE *)(a1 + 18) ^= 0x13u;}else{if ( i % 2 )v3 = *(_BYTE *)(i + a1) - i;elsev3 = *(_BYTE *)(i + a1 + 2);*(_BYTE *)(i + a1) = i ^ v3;}}v4 = 0;if ( a2 <= 0 )return 1;v5 = 0;while ( byte_40A030[v5] == *(_BYTE *)(v5 + a1) ){v5 = ++v4;if ( v4 >= a2 ) return 1;}return 0;
}

解密代码


enc = [0x61, 0x6A, 0x79, 0x67, 0x6B, 0x46, 0x6D, 0x2E, 0x7F, 0x5F,0x7E, 0x2D, 0x53, 0x56, 0x7B, 0x38, 0x6D, 0x4C, 0x6E
]flag=list("-------------------")for i in range(len(enc)):if i == 18:enc[i] ^= 0x13else:v3 = enc[i] ^ iif i % 2 == 1:flag[i] = chr(v3 + i)else:flag[i + 2] = chr(v3)for i in range(len(enc)):print(flag[i],end='')

引用别人博客的一句话:

现在程序流程就很明朗了,粗略来看程序流程是CreateFileA->(lpAddress里存的指令)WriteFile->sub_401240,但是在经过sub_401220()的处理以后,变成了CreateFileA->(lpAddress里存的指令)sub_401080->sub_401240。

sub_401240中即使不符合也不会给NumberOfBytesWritten置成0

nd=‘’)


> 引用别人博客的一句话:> > 现在程序流程就很明朗了,粗略来看程序流程是CreateFileA->(lpAddress里存的指令)WriteFile->sub_401240,但是在经过sub_401220()的处理以后,变成了CreateFileA->(lpAddress里存的指令)sub_401080->sub_401240。sub_401240中即使不符合也不会给NumberOfBytesWritten置成0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/474244.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 面向对象

C# 面向对象编程 面向过程&#xff1a;一件事情分成多个步骤来完成。 把大象装进冰箱 (面向过程化设计思想)。走一步看一步。 1、打开冰箱门 2、把大象放进冰箱 3、关闭冰箱门 面向对象&#xff1a;以对象作为主体 把大象装进冰箱 1、抽取对象 大象 冰箱 门 &#xff0…

【AI图像生成网站Golang】项目架构

AI图像生成网站 目录 一、项目介绍 二、雪花算法 三、JWT认证与令牌桶算法 四、项目架构 五、图床上传与图像生成API搭建 六、项目测试与调试(等待更新) 四、项目架构 本项目的后端基于Golang和Gin框架开发&#xff0c;主要包括的模块有&#xff1a; backend/ ├── …

Acme PHP - Let‘s Encrypt

Lets Encrypt是一个于2015年三季度推出的数字证书认证机构&#xff0c;旨在以自动化流程消除手动创建和安装证书的复杂流程&#xff0c;并推广使万维网服务器的加密连接无所不在&#xff0c;为安全网站提供免费的SSL/TLS证书。 使用PHP来更新证书&#xff1a; Acme PHP | Rob…

前后端交互之动态列

一. 情景 在做项目时&#xff0c;有时候后会遇到后端使用了聚合函数&#xff0c;导致生成的对象的属性数量或数量不固定&#xff0c;因此无法建立一个与之对应的对象来向前端传递数据&#xff0c;这时可以采用NameDataListVO向前端传递数据。 Data Builder AllArgsConstructo…

【LeetCode 题】只出现一次的数字--其余数字都出现3次

&#x1f536;力扣上一道有意思的题&#xff0c;参考了评论区的解法&#xff0c;一起来学习 &#x1f354;思路说明&#xff1a; &#x1f31f;举例说明 &#xff1a; nums [2,2,3,2] 我们需要把其中的数字 ‘3’ 找出来 1️⃣把每个数都想成32位的二进制数&#xff08;这里举…

如何在 Ubuntu 上安装 Jupyter Notebook

本篇文章将教你在 Ubuntu 服务器上安装 Jupyter Notebook&#xff0c;并使用 Nginx 和 SSL 证书进行安全配置。 我将带你一步步在云服务器上搭建 Jupyter Notebook 服务器。Jupyter Notebook 在数据科学和机器学习领域被广泛用于交互式编码、可视化和实验。在远程服务器上运行…

一文了解Android的核心系统服务

在 Android 系统中&#xff0c;核心系统服务&#xff08;Core System Services&#xff09;是应用和系统功能正常运行的基石。它们负责提供系统级的资源和操作支持&#xff0c;包含了从启动设备、管理进程到提供应用基础组件的方方面面。以下是 Android 中一些重要的核心系统服…

学者观察 | 元计算、人工智能和Web 3.0——山东大学教授成秀珍

导语 成秀珍教授提出元计算是在开放的零信任环境下整合算力资源打通数据壁垒构建自进化智能的新质生产力技术&#xff0c;是一种新计算范式&#xff1b;区块链是Web3.0的核心技术之一&#xff0c;有助于保障开放零信任环境下&#xff0c;用户、设备和服务间去中心化数据流通的…

集群聊天服务器(9)一对一聊天功能

目录 一对一聊天离线消息服务器异常处理 一对一聊天 先新添一个消息码 在业务层增加该业务 没有绑定事件处理器的话消息会派发不出去 聊天其实是服务器做一个中转 现在同时登录两个账号 收到了聊天信息 再回复一下 离线消息 声明中提供接口和方法 张三对离线的李…

MySQL —— MySQL索引介绍、索引数据结构、聚集索引和辅助索引、索引覆盖

文章目录 索引概念索引分类索引数据结构种类Innodb 索引数据结构聚集索引和辅助索引&#xff08;非聚集索引&#xff09;聚集索引辅助索引&#xff08;非聚集索引&#xff09; 索引覆盖 索引概念 索引是对数据库表中一列或多列的值进行排序后的一种数据结构。用于帮助 mysql 提…

4A架构之间的关系和集成

首先我们还是来看业务架构业务域&#xff0c;大家都知道在业务架构里面其实有三个核心的内容&#xff0c;一个是价值流&#xff0c;一个是业务能力&#xff0c;一个是业务流程。 价值流往往就是顶端的流程&#xff0c;业务能力的分解往往是2~4级&#xff0c;对于详细的业务流程…

RadSystems 自定义页面全攻略:个性化任务管理系统的实战设计

系列文章目录 探索RadSystems&#xff1a;低代码开发的新选择&#xff08;一&#xff09;&#x1f6aa; 探索RadSystems&#xff1a;低代码开发的新选择&#xff08;二&#xff09;&#x1f6aa; 探索RadSystems&#xff1a;低代码开发的新选择&#xff08;三&#xff09;&…

([LeetCode仓颉解题报告] 661. 图片平滑器

[LeetCode仓颉解题报告] 661. 图片平滑器 一、 题目1. 题目描述2. 原题链接 二、 解题报告1. 思路分析2. 复杂度分析3. 代码实现 三、 本题小结四、 参考链接 一、 题目 1. 题目描述 2. 原题链接 链接: 661. 图片平滑器 二、 解题报告 1. 思路分析 由于只需要3*39个格子&am…

若依权限控制

springbootvue2项目中的权限控制(若依项目) 步骤: 1.登录管理员账号,为普通用户增加权限按钮 绿色部分为权限控制字符 2.在后端对应的方法上增加权限控制(这里以删除操作为例):PreAuthorize(“ss.hasPermi(‘area:store:remove’)”) 3.在前端对应的按钮上增加权限控制:v-ha…

gvim添加至右键、永久修改配置、放大缩小快捷键、ctrl + c ctrl +v 直接复制粘贴、右键和还原以前版本(V)冲突

一、将 vim 添加至右键 进入安装目录找到 vim91\install.exe 管理员权限执行 Install will do for you:1 Install .bat files to use Vim at the command line:2 Overwrite C:\Windows\vim.bat3 Overwrite C:\Windows\gvim.bat4 Overwrite C:\Windows\evim.bat…

使用 OpenAI 进行数据探索性分析(EDA)

探索性数据分析&#xff08;Exploratory Data Analysis, 简称 EDA&#xff09;是数据分析中不可或缺的环节&#xff0c;帮助分析师快速了解数据的分布、特征和潜在模式。传统的 EDA 通常需要手动编写代码或使用工具完成。现在&#xff0c;通过 OpenAI 的 GPT-4 模型&#xff0c…

汽车资讯新篇章:Spring Boot技术启航

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

【EasyExcel】复杂导出操作-自定义颜色样式等(版本3.1.x)

文章目录 前言一、自定义拦截器二、自定义操作1.自定义颜色2.合并单元格 三、复杂操作示例1.实体(使用了注解式样式)&#xff1a;2.自定义拦截器3.代码4.最终效果 前言 本文简单介绍阿里的EasyExcel的复杂导出操作&#xff0c;包括自定义样式&#xff0c;根据数据合并单元格等。…

【ACM独立出版|高校主办】第四届信号处理与通信技术国际学术会议(SPCT 2024)

第四届信号处理与通信技术国际学术会议&#xff08;SPCT 2024&#xff09; 2024 4th International Conference on Signal Processing and Communication Technology 2024年12月27-29日 中国深圳 www.icspct.com 会议亮点&#xff1a; 1、ACM独立出版&#xff0c;EI稳…

笔记01----Transformer高效语义分割解码器模块DEPICT(即插即用)

学习笔记01----即插即用的解码器模块DEPICT 前言源码下载DEPICT实现实验 前言 文 章 标 题&#xff1a;《Rethinking Decoders for Transformer-based Semantic Segmentation: Compression is All You Need》 当前的 Transformer-based 方法&#xff08;如 DETR 和其变体&…