(2023.7.15)软件加密与解密-番外1-PWN2REVERSE[XDbg]
/提示:如果你看到了这行文字,那说明您的预览器不支持内嵌 CSS 代码,请使用 VSCode 阅读本 Markdown 文件/
每天一个技术点
(2023.7.15)软件加密与解密-番外1-PWN2REVERSE[XDbg]
本文作者:XDbg(小吧唧)
发布时间:2023年7月15日
内容概要:初学 PWN 后对 VMP Handler 的快速定位
1. 准备
加壳工具:VMP3.6
测试代码:
// test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// 编译为 32 位程序
#include <iostream>
int main()
{
// vmp mov handle
int* p = 0x0;
*p = 1;
// vmp add handle
*p = 1 + 2;
// vmp sub handle
*p = 9 - 9;
}
调试工具:OllyDbg_P.Y.G
PE工具:StudyPE+ x64
2. 加壳
用 StudyPE 固定程序基址,然后保存,扔到 VMP 中。
%E8%BD%AF%E4%BB%B6%E5%8A%A0%E5%AF%86%E4%B8%8E%E8%A7%A3%E5%AF%86-%E7%95%AA%E5%A4%961%5BXDbg%5D-4.png)
在 VMP 中添加 main 函数。
%E8%BD%AF%E4%BB%B6%E5%8A%A0%E5%AF%86%E4%B8%8E%E8%A7%A3%E5%AF%86-%E7%95%AA%E5%A4%961%5BXDbg%5D-1.png)
选项设置:超级
%E8%BD%AF%E4%BB%B6%E5%8A%A0%E5%AF%86%E4%B8%8E%E8%A7%A3%E5%AF%86-%E7%95%AA%E5%A4%961%5BXDbg%5D-2.png)
点击加壳就好了,运行程序测试,异常了,漂亮。
%E8%BD%AF%E4%BB%B6%E5%8A%A0%E5%AF%86%E4%B8%8E%E8%A7%A3%E5%AF%86-%E7%95%AA%E5%A4%961%5BXDbg%5D-3.png)
3. 调试
将 test.vmp.exe 扔到 OllyDbg_P.Y.G 里,然后跑起来。
mov32 handler
程序出现异常断下来了,可以看到 arg2 ,即我们的 *p = arg2 ,看到右下角的堆栈窗口,我们看到了 p 这个变量的指针(地址)
%E8%BD%AF%E4%BB%B6%E5%8A%A0%E5%AF%86%E4%B8%8E%E8%A7%A3%E5%AF%86-%E7%95%AA%E5%A4%961%5BXDbg%5D-6.png)
所以我们能够写出如下匹配指令模板:
MOV EDX, DWORD PTR SS:[EBP] ; arg1
MOV ECX, DWORD PTR SS:[EBP+0x4] ; arg2
MOV DWORD PTR DS:[EDX], ECX
进一步概括为
MOV REG, DWORD PTR SS:[EBP] ; arg1
MOV REG2, DWORD PTR SS:[EBP+0x4] ; arg2
MOV DWORD PTR DS:[REG], REG2
好了这个 handler 就这么结束了,下一站,addHandler。让我们 F9 起来。
add32 handler
有没有搞错啊,这次连一个参数都不给看。真不给面子。
%E8%BD%AF%E4%BB%B6%E5%8A%A0%E5%AF%86%E4%B8%8E%E8%A7%A3%E5%AF%86-%E7%95%AA%E5%A4%961%5BXDbg%5D-7.png)
目前我们有如下信息,根据上一步的经验,我们可以发现,我们的代码写错了,哈哈,这依旧是条 mov32 handler。
MOV DWORD PTR DS:[EDX], ECX
让我们好好想想:*p = 1 + 2 这行代码应该执行什么样的 handler ?
%E8%BD%AF%E4%BB%B6%E5%8A%A0%E5%AF%86%E4%B8%8E%E8%A7%A3%E5%AF%86-%E7%95%AA%E5%A4%961%5BXDbg%5D-8.png)
公布答案~ 大概就是这样了吧,有问题的话,以后再修改。
push32 arg1 // 1
push32 arg2 // 2
add32()
pop32 eflag // 206
pop32 arg2 // 3
push32 arg2 // 1+2 = 3
push32 arg3 // p
mov32()
pop eflag // 520
xxxx
既然现在知道了 handler 的执行流程。
我们就可以知道哪里有问题了,应该改成如下代码:
*p = 1 + *p;
既然 这行写错了,那么 vmp sub handle 这一块代码就也写错了,将其更改成这样的形式:
*p = 9 - *p;
再编译一次,重新调试一下。可以看到,程序断下了,是取 p 的操作。
%E8%BD%AF%E4%BB%B6%E5%8A%A0%E5%AF%86%E4%B8%8E%E8%A7%A3%E5%AF%86-%E7%95%AA%E5%A4%961%5BXDbg%5D-9.png)
MOV EAX, DWORD PTR SS:[EBP]
MOV EDX, DWORD PTR DS:[EAX]
MOV DWORD PTR SS:[EBP], EDX
进一步概括
MOV REG, DWORD PTR SS:[EBP]
MOV REG2, DWORD PTR DS:[REG]
MOV DWORD PTR SS:[EBP], REG2
跳过出异常的指令,同时我们给 ebp 指向的地址下个硬件断点。接下来给出单步时,发现的信息。
MOV EDX, DWORD PTR SS:[EBP]
MOV EAX, DWORD PTR SS:[EBP]
MOVZX EDX, SI
MOV EDX, DWORD PTR DS:[EAX]
CLC
MOV DWORD PTR SS:[EBP], EDX
发现了 add32 handler 。
MOV ECX, DWORD PTR SS:[EBP]
MOV EDX, DWORD PTR SS:[EBP+0x4]
ADD ECX, EDX
MOV DWORD PTR SS:[EBP+0x4], ECX
PUSHFD
POP DWORD PTR SS:[EBP]
进一步概括
MOV REG, DWORD PTR SS:[EBP]
MOV REG2, DWORD PTR SS:[EBP+0x4]
ADD REG, REG2
MOV DWORD PTR SS:[EBP+0x4], REG
PUSHFD
POP DWORD PTR SS:[EBP]
好啦,现在我们定位到了 vmp add32 handler,下一站 subHandler。
sub16 handler
此时,我的硬件断点仍没有取消,直接 F9 就好了。
让我们看看,不得了不得了,怎么会是加法运算呢,让我们再次修改下代码,进行调试看看。
%E8%BD%AF%E4%BB%B6%E5%8A%A0%E5%AF%86%E4%B8%8E%E8%A7%A3%E5%AF%86-%E7%95%AA%E5%A4%961%5BXDbg%5D-10.png)
代码修改如下,只留了一个减法指令。
%E8%BD%AF%E4%BB%B6%E5%8A%A0%E5%AF%86%E4%B8%8E%E8%A7%A3%E5%AF%86-%E7%95%AA%E5%A4%961%5BXDbg%5D-11.png)
加壳的时候,选项改为虚拟,我倒要看看,vmp 把 sub 指令变成什么样了。
%E8%BD%AF%E4%BB%B6%E5%8A%A0%E5%AF%86%E4%B8%8E%E8%A7%A3%E5%AF%86-%E7%95%AA%E5%A4%961%5BXDbg%5D-12.png)
让我们重整旗鼓,再来一次。此时程序读取了 *p 的内容,看样子是要做减法运算了。
%E8%BD%AF%E4%BB%B6%E5%8A%A0%E5%AF%86%E4%B8%8E%E8%A7%A3%E5%AF%86-%E7%95%AA%E5%A4%961%5BXDbg%5D-13.png)
现在我要传授最基本技术点:单步 F8。
这里可以看到 vmp 对 0x99999 进行了 not 操作产生了 FFF66666 。
%E8%BD%AF%E4%BB%B6%E5%8A%A0%E5%AF%86%E4%B8%8E%E8%A7%A3%E5%AF%86-%E7%95%AA%E5%A4%961%5BXDbg%5D-15.png)
此时,我们对 [ebp + 4] 下硬件访问断点,我们成功断在了正确的位置上。
%E8%BD%AF%E4%BB%B6%E5%8A%A0%E5%AF%86%E4%B8%8E%E8%A7%A3%E5%AF%86-%E7%95%AA%E5%A4%961%5BXDbg%5D-16.png)
让我们来好好想想 vmp 的 sub 指令是如何运算的。(不用想了,刚才的调试已经告诉我们答案了)
sub(a,b) = not(add(not(a),b))
4. 结尾
希望大家多多支持、参与这个开源项目。(〃'▽'〃)
测试文件下载地址:
(2023.7.15)软件加密与解密-番外1-PWN2REVERSE[XDbg]
(2023.7.15)软件加密与解密-番外1-PWN2REVERSE[XDbg]的更多相关文章
- 常见的加密和解密算法—MD5
一.MD5加密概述 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 13 ...
- C#.NET中对称和非对称加密、解密方法汇总--亲测可用
C#.NET中对称和非对称加密.解密方法汇总--亲测可用 在安全性要求比较高的系统中都会涉及到数据的加密.解密..NET为我们封装了常用的加密算法,例如:MD5,DES,RSA等.有可逆加密,也有 ...
- Security基础(二):SELinux安全防护、加密与解密应用、扫描与抓包分析
一.SELinux安全防护 目标: 本案例要求熟悉SELinux防护机制的开关及策略配置,完成以下任务: 将Linux服务器的SELinux设为enforcing强制模式 在SELinux启用状态下, ...
- Java_DES 加密和解密源码
Java密码学结构设计遵循两个原则: 1) 算法的独立性和可靠性. 2) 实现的独立性和相互作用性. 算法的独立性是通过定义密码服务类来获得.用户只需了解密码算法的概念,而不用去关心如何实现这些概念. ...
- Java实现文件的加密与解密
最近在做一个项目,需要将资源文件(包括图片.动画等类型)进行简单的加密后再上传至云上的服务器,而在应用程序中对该资源使用前先将读取到的文件数据进行解密以得到真正的文件信息.此策略的原因与好处是将准备好 ...
- JS URL 使用base64加密与解密
JS编码方式: <script type="text/javascript"> document.write(encodeURI("http://www.w3 ...
- java代码实现对excel加密、解密(设置或去除打开密码)
使用jxcell组件来完成对excel加密.解密的功能. jxcell.jar[点击下载](此jar没有使用限制,你懂得) 具体代码如下: import java.io.IOException; im ...
- OD学习笔记10:一个VB程序的加密和解密思路
前边,我们的例子中既有VC++开发的程序,也有Delphi开发的程序,今天我们给大家分析一个VB程序的加密和解密思路. Virtual BASIC是由早期DOS时代的BASIC语言发展而来的可视化编程 ...
- RSA不对称加密,公钥加密私钥解密,私钥加密公钥解密
RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...
- Java DES 加密和解密源码(转)
原文地址:http://www.oschina.net/code/snippet_727646_18383 Java密码学结构设计遵循两个原则: 1) 算法的独立性和可靠性. 2) 实现的独立性和相互 ...
随机推荐
- 代码随想录算法训练营Day18 二叉树| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树
654.最大二叉树 题目链接:654.最大二叉树 给定一个不重复的整数数组 nums . 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值. 递归地 ...
- 我们的智能化应用是需要自动驾驶(Autopilot)还是副驾驶(Copilot)
自动驾驶Autopilot 是一个知识密集且科技含量很高的技术,不基于点什么很难把它讲的相对清楚. 副驾驶 Copilot 是一种由 AI 提供支持的数字助理,旨在为用户提供针对一系列任务和活动的个性 ...
- STL-array(ACM)
1.C++ 11 出现的, C++98没有 2.可以作为数组元素 pair<array<int, 3>, int>pair<int a[3], int > 不能这样 ...
- 深入浅出MySQL事务
Photo by Lukas Hartmann from Pexels 辞职这段时间以来看见了很多工作之外的东西,我认为这是值得的.同时也有时间和机会来好好整理所学所想,准备开启下一段旅途. 事务的定 ...
- 10. docker方式下的mysql设置主从复制(一主两从)
上一篇 [centos 使用 docker 方式安装 mysql] 笔记中,我们在三个虚拟机中使用 docker 方式新建了三个 mysql 容器服务,那么我们这篇文章来记录下,如何在这三台机器中设置 ...
- 【C++ Primer】2.1 基本内置类型
1. 基本内置类型 基本算数类型: 类型 含义 最小尺寸 bool 布尔类型 8bits char 字符 8bits wchar_t 宽字符 16bits char16_t Unicode字符 16b ...
- ARC118E Avoid Permutations
题意 给定一个长度为 \(n\) 的排列 \(p\),在一个 \((n + 2)\times(n + 2)\) 的网格上,禁止通过 \((i, p_i)\) 这些点,每次只能向上或右走一格,从 \(( ...
- 【技术积累】Spring Boot中的基础知识【一】
写在前面 笔者在学校里学习Spring项目的时候,基本上都是老师照着书念PPT,然后演示一些有限的课堂案例,笔者印象很深刻,学校里整个Spring项目也就做了留个课堂练习,而且难度基本上属于连接上数据 ...
- 一个跨平台的`ChatGPT`悬浮窗工具
一个跨平台的ChatGPT悬浮窗工具 使用avalonia实现的ChatGPT的工具,设计成悬浮窗,并且支持插件. 如何实现悬浮窗? 在使用avalonia实现悬浮窗也是非常的简单的. 实现我们需要将 ...
- 使用Python接口自动化测试post请求和get请求,获取请求返回值
引言我们在做python接口自动化测试时,接口的请求方法有get,post等:get和post请求传参,和获取接口响应数据的方法: 请求接口为Post时,传参方法我们在使用python中request ...