(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) 实现的独立性和相互 ...
随机推荐
- uni-app 环境搭建
环境搭建:下载Hbuilder X开发者工具 下载Hbuilderhttps://www.dcloud.io/index.htmlhttps://www.dcloud.io/hbuilderx.htm ...
- 用Linux命令操作mysql数据库
操作mysql数据库,相信大家最熟悉的应该是用navicat工具来新建数据库,建表,查询数据,查看表结构等. 但是如果数据库与本操作机器不在同一个局域网内,并且对方环境也不支持vpn的情况下,如何查询 ...
- Not a managed type: class com.example.commonspojo.entity,公共实体类剥离,然后引入报错的问题及解决办法
最近搞springcloud项目遇到在商品服务中调用基本服务时jvm扫描不到的问题 需要加@entityscan 学习博客: (9条消息) Not a managed type: class com. ...
- windows内核学习一
变量类型 kernel user ULONG unsigned long PULONG unsigned long* UCHAR unsigned char PUCHAR unsigned char* ...
- Rust 语言风靡学术界
AWS 将 Rust 编译器团队负责人收入麾下的新闻让开发者们再次聚焦于这门兼具安全性与高性能的编程语言.近日,著名科学期刊 Nature 刊登了一篇文章,表明 Rust 语言也正在成为学术界最受欢迎 ...
- 使用Mybatis-Plus问题解答
我们使用一个新的框架难免会遇到各种问题,当然使用这款国产的优秀的Mybatis-Plus框架也不例外,下面我就给大家列举一下使用Mybatis-Plus可能遇到的一些问题,并做一下一一的解答. 1:如 ...
- 一分钟学一个 Linux 命令 - mv 和 cp
前言 大家好,我是god23bin.欢迎来到<一分钟学一个 Linux 命令>系列,今天需要你花两分钟时间来学习下,因为今天要讲的是两个命令,mv 和 cp 命令. mv 什么是 mv 命 ...
- ASP.NET Core 6框架揭秘实例演示[39]:使用最简洁的代码实现登录、认证和注销
认证是一个确定请求访问者真实身份的过程,与认证相关的还有其他两个基本操作--登录和注销.ASP.NET Core利用AuthenticationMiddleware中间件完成针对请求的认证,并提供了用 ...
- 【tvm解析】 Operator Strategy 机制
本文地址:https://www.cnblogs.com/wanger-sjtu/p/15082871.html Relay Operator Strategy是建立Relay IR与TOPI算子库的 ...
- 统信UOS系统开发笔记(七):在统信UOS系统上使用linuxdeployqt发布qt程序
前言 在ubuntu上发布qt程序相对还好,使用脚本,但是在统信UOS麒麟上发布的时候,因为银河麒麟等不同版本,使用脚本就不太兼容,同时为了实现直接点击应用可以启动应用的效果,使用linuxdep ...