客户端安全开发基础-PC篇-附项目源码

客户端安全开发基础-PC篇


written by noxke


项目源码下载

https://download.csdn.net/download/Runnymmede/90079718

1.程序分析

使用ida打开crackme.exe,进入到程序的主逻辑函数,注意到有大量的xmm寄存器,但是不含call指令,先忽略,注意到两个特殊部分:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

左图中调用了CreateThread函数创建子线程运行StartAddress处函数,右侧含有分支判断,完成判断后sleep并返回,猜测该处与程序的判断逻辑有关

F5查看反编译代码

末尾进行了数据串的比较,后根据比较结果为v32地址处的4个字节赋值,紧接着两个字节赋值0x0a,0x0d,换行回车符号,猜测v32地址处为输出字符串,结合测试时的输出错误,猜测0xCBF9DBB4 0x8FFFCBD5经过异或后为gbk编码格式的字符串,在线编码工具测试,猜测成立

显然,v37处储存的内容影响最后的输出结果,对v32=v37下断点启动调试,随意输入字符串后在该处断下,查看v32内容

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显然, v37为输入的原内容,根据比较部分可以得知,v37-48处为flag

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

得到程序flagHiGWDUuXQS6wVHBTp0ERfJe6VqprMqD1

分析剩余部分得到程序的输入函数和输出函数,后续将称其为printf scanf

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.DLL注入分析

题目要求使用CreateRemoteThreadapi进行注入

最基础的代码注入方式, 使用CreateRemoteThread在目标进程下创建远程线程, 调用LoadLibraryA加载DLL到目标进程, DLL加载/卸载时调用DllMain函数, 执行注入DLL中的代码, LoadLibraryA参数需要先写入目标进程的内存, 使用VirtualAllocEx在目标进程内存下分配内存, 使用WriteProcessMemory将需要注入的DLL地址写入目标内

hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);
pRemoteBuf = VirtualAllocEx(hProcess, NULL, dwBufSize, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, pRemoteBuf, dllPath, dwBufSize, NULL);
hMod = GetModuleHandleA((LPCSTR)"kernel32.dll");
pThreadProc = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod, "LoadLibraryA");
CreateRemoteThread(hProcess, NULL, 0, pThreadProc, pRemoteBuf, 0, NULL);

创建远程线程时传入的LoadLibraryA地址并不是直接获取目标进程中的函数地址, 因为系统DLL在不同进程中加载地址相同

编写一个输出字符串的DLL进行注入测试

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注入creackme.exe失败,但注入其他程序正常,重新分析代码,分析CreateThread函数创建的线程执行的StartAddress处代码,找到关键位置

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此处将LoadLibraryExW函数的内存权限修改为可写入,然后将第一个字节patch成-61(0xC3, ret指令),将指令第一行修改为ret指令,将LoadLibraryExW函数patch掉了,因此LoadLibraryA函数也无法正常使用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不过中间有10秒的sleep,在启动后就注入即可

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.hook代码

将输出结果修改称正确,patch一下分支语句或者将错误的gbk编码patch成正确就可以,但是题目要求用DLL注入hook程序,因此此处用注入的DLL修改程序,hook掉printf函数,思路如下

printf前几行指令修改为跳转指令,跳转到注入的shellcode中,在shellcode中判断printf的参数(即待输出的字符串)是否为错误,如果为错误,将其修改为正确,替换完成后在shellcode中执行printf前几行被替换的指令,然后返回到printf函数继续执行,输出修改后的字符串

printf修改前后代码:

修改前前4条指令为将寄存器参数压入堆栈,此处将其修改为

mov eax, $shellcode
push rax
ret

将shellcode的地址压入堆栈中,使用ret指令跳转到shellcode代码出,shellcode代码如下(前后填充的nop省略)

主要代码为

mov eax, [rcx]         ; 将printf第一个参数(输出字符串)的前四个字节传送到eax
cmp eax, 0xF3CEEDB4    ; 判断这四个字节是否为错误两个字的gbk编码
jne $+0x8              ; 不是错误两个字的gbk编码则跳过接下来两条指令
mov eax, 0xB7C8FDD5    ; 如果是错误两个字的gbk编码,将其修改为正确两个字的gbk编码
mov [rcx], eax         ; 将这四个字节写回输出字符串,完成替换
;原printf函数前4条指令    ; 为printf完成参数压栈
mov rax, $printf+0x20  ; printf的指令位置,跳过修改的代码
push rax               ; push ret压栈返回
ret

只需要在注入的DLL中计算printf的地址,将地址写入shellcode,将shellcode写入可执行内存,再hook掉printf的代码即可完成修改操作

设置hook代码如下:

void set_hook()
{// hook printf函数DWORD64 pProc;DWORD64 pProcOffset = 0x1020;HMODULE hModule = GetModuleHandle(nullptr);DWORD_PTR baseAddress = reinterpret_cast<DWORD_PTR>(hModule);pProc = (DWORD64)baseAddress + pProcOffset;printf("\nhook proc addr : 0x%llx\n", pProc);// 修改shellcode中的返回地址 printf+0x10*((DWORD64 *)((uint8_t *)shellcode + 0x50 - 0x1A)) = (pProc + 0x10);// 写入shellcodeLPVOID shellcodeBuf = VirtualAlloc(NULL, 0x50, MEM_COMMIT, PAGE_EXECUTE_READWRITE);memcpy(shellcodeBuf, shellcode, 0x50);DWORD64 dwShellcodeBuf = (DWORD64)shellcodeBuf;printf("\nshell code addr : 0x%llx\n", dwShellcodeBuf);// 修改函数内存保护权限VirtualProtect((LPVOID)pProc, 20, PAGE_EXECUTE_READWRITE, NULL);// 修改hookcode中的shellcode地址*((DWORD64 *)((uint8_t *)hookcode + 6)) = dwShellcodeBuf;// 获取进程句柄HANDLE hProcess = GetCurrentProcess();// hook printf函数WriteProcessMemory(hProcess, (LPVOID)pProc, hookcode, 20, NULL);
}

由于PE文件加载时会进行重定向操作,所以printf函数的地址不固定,需要通过PE文件加载的基地址+函数偏移量得到printf函数的准确地址,另外shellcode需要申请可执行内存块确保指令可以正常执行,需要修改printf函数的内存块可写,修改其前几行指令

注入后运行程序,任意输入均返回正确

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

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

相关文章

static关键字在嵌入式C编程中的应用

目录 一、控制变量的存储周期和可见性 1.1. 局部静态变量 1.2. 全局静态变量 二、控制函数的可见性 2.1. 静态函数 2.2. 代码示例&#xff08;假设有两个文件&#xff1a;file1.c和file2.c&#xff09; 三、应用场景 3.1. 存储常用数据 3.2. 实现内部辅助函数 四、注…

Linux笔记---进程:进程替换

1. 进程替换的概念 进程替换是指在一个正在运行的进程中&#xff0c;用一个新的程序替换当前进程的代码和数据&#xff0c;使得进程开始执行新的程序&#xff0c;而不是原来的程序。 这种技术通常用于在不创建新进程的情况下&#xff0c;改变进程的行为。 我们之前谈到过for…

借助 AI 工具,共享旅游-卡-项目助力年底增收攻略

年底了&#xff0c;大量的商家都在开始筹备搞活动&#xff0c;接下来的双十二、元旦、春节、开门红、寒假&#xff0c;各种活动&#xff0c;目的就是为了拉动新客户。 距离过年还有56 天&#xff0c;如何破局&#xff1f; 1、销售渠道 针对旅游卡项目&#xff0c;主要销售渠道…

剖析千益畅行,共享旅游-卡,合规运营与技术赋能双驱下的旅游新篇

在数字化浪潮席卷各行各业的当下&#xff0c;旅游产业与共享经济模式深度融合&#xff0c;催生出旅游卡这类新兴产品。然而&#xff0c;市场乱象丛生&#xff0c;诸多打着 “共享” 幌子的旅游卡弊病百出&#xff0c;让从业者与消费者都深陷困扰。今天&#xff0c;咱们聚焦技术…

9. 一分钟读懂“策略模式”

9.1 模式介绍 策略模式是一种行为型设计模式&#xff0c;用于在运行时灵活切换对象的行为或算法&#xff0c;它将算法封装为独立的类&#xff0c;使得它们可以互相替换&#xff0c;而不会影响使用这些算法的客户端代码。 策略模式的核心思想是&#xff1a;定义一系列可互换的算…

Ant-Design X,AI组件库

前端的小伙伴们都知道有一个前端组件库超级火&#xff0c;可以说是 Top1 级别的&#xff0c;那就是 Ant-Design 而就在最近&#xff0c;他们又推出了一款新的组件库&#xff0c;Ant-Design X&#xff0c;这是专门用来做 AI 产品 的组件库&#xff0c;可能大家还很疑惑&#xf…

Wwise 使用MIDI文件、采样音频

第一种&#xff1a;当采样音频只有一个文件的时候 1.拖入MIDI文件到Interactive Music Hierarchy层级 2.拖入采样音频到Actor-Mixer Hierarchy层级 3.勾选MIDI显示出面板&#xff0c;设置Root Note与采样音频音高相同&#xff0c;这里是C#5 4.播放测试&#xff0c;成功&…

如何抽象策略模式

策略模式是什么 策略设计模式&#xff08;Strategy Pattern&#xff09;是一种面向对象设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换。这种模式使得算法可以独立于使用它们的客户端而变化。 策略设计模式包含三个主…

优先算法 —— 滑动窗口系列 - 无重复字符的最长子串

目录 前言 1. 无重复字符的最长子串 2. 题目解析 3. 算法原理 解法1&#xff1a;暴力枚举 哈希表&#xff08;判断字符是否有重复出现&#xff09; 解法2&#xff1a;滑动窗口 4. 代码 前言 当我们发现暴力解法两个指针都不回退&#xff0c;都是向同一个方向移动的时候我…

BurpSuite工具-Proxy代理用法(抓包、改包、放包)

一、Burp Suite 项目管理 二、Proxy&#xff08;代理抓包模块&#xff09; 1. 简要说明 1.1. Intercept&#xff08;拦截&#xff09; 1.2. HTTP History&#xff08;HTTP 历史&#xff09; 1.3. WebSockets History&#xff08;WebSocket 历史&#xff09; 1.4. Options…

Marvell第四季度营收预计超预期,定制芯片需求激增

芯片制造商Marvell Technology&#xff08;美满电子科技&#xff09;&#xff08;MRVL&#xff09;在周二发布了强劲的业绩预告&#xff0c;预计第四季度的营收将超过市场预期&#xff0c;得益于企业对其定制人工智能芯片的需求激增。随着人工智能技术的快速发展&#xff0c;特…

915DEBUG-obsidianTemplater使用

Templater使用 tp函数不正常显示相应数据 模板使用方式不正确 <% tp.date.now("YYYY-MM-DD") %> 应该被放置在一个被Templater识别为模板的文件中&#xff0c;或者在你使用Templater的插入模板功能时输入。如果只是在一个普通的Markdown文件中直接输入这段代码…

html+css网页设计马林旅行社移动端4个页面

htmlcss网页设计马林旅行社移动端4个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#…

笔记本电脑usb接口没反应怎么办?原因及解决方法

笔记本电脑的USB接口是我们日常使用中非常频繁的一个功能&#xff0c;无论是数据传输、充电还是外接设备&#xff0c;都离不开它。然而&#xff0c;当USB接口突然没有反应时&#xff0c;这无疑会给我们的工作和学习带来不小的困扰。下面&#xff0c;我们就来探讨一下笔记本USB接…

JAVA |日常开发中Servlet详解

JAVA &#xff5c;日常开发中Servlet详解 前言一、Servlet 概述1.1 定义1.2 历史背景 二、Servlet 的生命周期2.1 加载和实例化2.2 初始化&#xff08;init 方法&#xff09;2.3 服务&#xff08;service 方法&#xff09;2.4 销毁&#xff08;destroy 方法&#xff09; 三、Se…

Python酷库之旅-第三方库Pandas(255)

目录 一、用法精讲 1206、pandas.tseries.offsets.SemiMonthEnd.is_on_offset方法 1206-1、语法 1206-2、参数 1206-3、功能 1206-4、返回值 1206-5、说明 1206-6、用法 1206-6-1、数据准备 1206-6-2、代码示例 1206-6-3、结果输出 1207、pandas.tseries.offsets.S…

MySQL——操作

一.库的操作 1.基本操作 创建数据库 create database 数据库名称; 查看数据库 show databases; 删除数据库 drop database 数据库名称; 执行删除之后的结果: 数据库内部看不到对应的数据库 对应的数据库文件夹被删除&#xff0c;级联删除&#xff0c;里面的数据表全部被删…

R语言机器学习论文(三):特征提取

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据一、数据归一化二、离散型分类变量的编码三、筛选特征四、重要特征五、输出结果六、总结系统信息介绍 在数据分析和机器学习项目中,经常需要对数据进行预…

CSS 动画效果实现:图片展示与交互

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Css篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Css篇专栏内容:CSS 动画效果实现&#xff1a;图片展示与交互 前言 在现代网页设计中&#xff0c;动态效果能够显著…

928DEBUG

在vscode上的ubuntu上的wsl&#xff0c;运行一个要求clang编译器的cmake项目 安装必要的工具&#xff1a; bash sudo apt install build-essential cmake ninja-build git 安装Clang编译器&#xff1a; bash复制 sudo apt install clang DEBUG 这是因为用的是windows上的cla…