(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) 实现的独立性和相互 ...
随机推荐
- APP中RN页面热更新流程-ReactNative源码分析
平时使用WebStorm或VSCode对RN工程中的文件修改后,在键盘上按一下快捷cmd+s进行文件保存,此时当前调试的RN页面就会自动进行刷新,这是RN开发相比于原生开发一个很大的优点:热更新. 那 ...
- 从 DevOps 到平台工程:软件开发的新范式
DevOps 是一种将开发和运营结合起来的方法,在应用规划.开发.交付和运营方面将人员.流程和技术结合起来.DevOps 使以前孤立的角色(如开发.IT运营.质量工程和安全)之间进行协调和合作.一直以 ...
- phpstudy-sqlilabs-less-11
题目:POST - Error Based - Single quotes- String 基于错误的单引号post型字符变形的注入 看到有个账密输入口第一反应尝试post注入 打开post data ...
- 向量数据库Pinecone,治疗ChatGPT幻觉的药方?
大白话了解新鲜事,今天讲讲以Pinecone为代表的向量数据库.向量数据库Pinecone一夜爆火,4月27日B轮拿到了1亿美元的融资,估值达到7.5亿美元,一个2021年刚刚推出的数据库产品,火爆背 ...
- More than one file was found with OS independent path 'lib/armeabi-v7a/libflutter.so'
今日一个flutter 整合ai到原生android 时老是提示如下错误 Caused by: com.android.builder.merge.DuplicateRelativeFileExcep ...
- ✗ CocoaPods not installed.
mac 配置 flutter 会提示许多 关于xcode的 如图 显示 ✗ CocoaPods installed but not initialized. 其实最开始提示的是 ✗ CocoaPods ...
- JS和Document
对象1.new var obj = new Object(); 2.函数声明对象 function Human () {}: 3.var obj = {}; 大括号 就是对象var obj = {}; ...
- Java 输入字符串,统计大写字母,小写字母,数字字符的个数
代码如下: public static void main(String[] args) { String str = "AaFsECvcS12483fs+-*/"; int bi ...
- SpringBoot项目从0到1配置logback日志打印
大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教. 以下是正文! 一.写文背景 我们在写后端项目的时候 ...
- 怎样优雅地增删查改(一):从0开始搭建Volo.Abp项目
@ 目录 项目介绍 模块化 由框架实现的 需要实现的 创建项目 创建业务模块 配置引用和依赖 配置DbContext 创建实体和Dto 配置AutoMapper 软件系统中数据库或者持久层的基本操作功 ...