/提示:如果你看到了这行文字,那说明您的预览器不支持内嵌 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 中。

在 VMP 中添加 main 函数。

选项设置:超级

点击加壳就好了,运行程序测试,异常了,漂亮。

3. 调试

将 test.vmp.exe 扔到 OllyDbg_P.Y.G 里,然后跑起来。

mov32 handler

程序出现异常断下来了,可以看到 arg2 ,即我们的 *p = arg2 ,看到右下角的堆栈窗口,我们看到了 p 这个变量的指针(地址)

所以我们能够写出如下匹配指令模板:

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

有没有搞错啊,这次连一个参数都不给看。真不给面子。

目前我们有如下信息,根据上一步的经验,我们可以发现,我们的代码写错了,哈哈,这依旧是条 mov32 handler。

MOV     DWORD PTR DS:[EDX], ECX

让我们好好想想:*p = 1 + 2 这行代码应该执行什么样的 handler ?

公布答案~ 大概就是这样了吧,有问题的话,以后再修改。

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 的操作。

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 就好了。

让我们看看,不得了不得了,怎么会是加法运算呢,让我们再次修改下代码,进行调试看看。



代码修改如下,只留了一个减法指令。



加壳的时候,选项改为虚拟,我倒要看看,vmp 把 sub 指令变成什么样了。

让我们重整旗鼓,再来一次。此时程序读取了 *p 的内容,看样子是要做减法运算了。

现在我要传授最基本技术点:单步 F8。

这里可以看到 vmp 对 0x99999 进行了 not 操作产生了 FFF66666 。



此时,我们对 [ebp + 4] 下硬件访问断点,我们成功断在了正确的位置上。



让我们来好好想想 vmp 的 sub 指令是如何运算的。(不用想了,刚才的调试已经告诉我们答案了)

sub(a,b) = not(add(not(a),b))

4. 结尾

希望大家多多支持、参与这个开源项目。(〃'▽'〃)

one-day-one-point

测试文件下载地址:

(2023.7.15)软件加密与解密-番外1-PWN2REVERSE[XDbg]

(2023.7.15)软件加密与解密-番外1-PWN2REVERSE[XDbg]的更多相关文章

  1. 常见的加密和解密算法—MD5

    一.MD5加密概述 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 13 ...

  2. C#.NET中对称和非对称加密、解密方法汇总--亲测可用

    C#.NET中对称和非对称加密.解密方法汇总--亲测可用   在安全性要求比较高的系统中都会涉及到数据的加密.解密..NET为我们封装了常用的加密算法,例如:MD5,DES,RSA等.有可逆加密,也有 ...

  3. Security基础(二):SELinux安全防护、加密与解密应用、扫描与抓包分析

    一.SELinux安全防护 目标: 本案例要求熟悉SELinux防护机制的开关及策略配置,完成以下任务: 将Linux服务器的SELinux设为enforcing强制模式 在SELinux启用状态下, ...

  4. Java_DES 加密和解密源码

    Java密码学结构设计遵循两个原则: 1) 算法的独立性和可靠性. 2) 实现的独立性和相互作用性. 算法的独立性是通过定义密码服务类来获得.用户只需了解密码算法的概念,而不用去关心如何实现这些概念. ...

  5. Java实现文件的加密与解密

    最近在做一个项目,需要将资源文件(包括图片.动画等类型)进行简单的加密后再上传至云上的服务器,而在应用程序中对该资源使用前先将读取到的文件数据进行解密以得到真正的文件信息.此策略的原因与好处是将准备好 ...

  6. JS URL 使用base64加密与解密

    JS编码方式: <script type="text/javascript"> document.write(encodeURI("http://www.w3 ...

  7. java代码实现对excel加密、解密(设置或去除打开密码)

    使用jxcell组件来完成对excel加密.解密的功能. jxcell.jar[点击下载](此jar没有使用限制,你懂得) 具体代码如下: import java.io.IOException; im ...

  8. OD学习笔记10:一个VB程序的加密和解密思路

    前边,我们的例子中既有VC++开发的程序,也有Delphi开发的程序,今天我们给大家分析一个VB程序的加密和解密思路. Virtual BASIC是由早期DOS时代的BASIC语言发展而来的可视化编程 ...

  9. RSA不对称加密,公钥加密私钥解密,私钥加密公钥解密

    RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...

  10. Java DES 加密和解密源码(转)

    原文地址:http://www.oschina.net/code/snippet_727646_18383 Java密码学结构设计遵循两个原则: 1) 算法的独立性和可靠性. 2) 实现的独立性和相互 ...

随机推荐

  1. Java商城网站系统设计与实现(带源码)

    基于Java的商城网站系统设计与实现 功能介绍 平台采用B/S结构,后端采用主流的Springboot框架进行开发,前端采用主流的Vue.js进行开发. 整个平台包括前台和后台两个部分. 前台功能包括 ...

  2. 2014年蓝桥杯C/C++大学B组省赛真题(奇怪的分式)

    题目描述: 上小学的时候,小明经常自己发明新算法.一次,老师出的题目是:1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png)老师刚想批评他,转念一想 ...

  3. Flutter热更新技术探索

    一,需求背景: APP发布到市场后,难免会遇到严重的BUG阻碍用户使用,因此有在不发布新版本APP的情况下使用热更新技术立即修复BUG需求.原生APP(例如:Android & IOS)的热更 ...

  4. 三分钟免费将 Claude API 接入个人服务

    首先我们介绍一下今天的主角 Claude Claude 是最近新开放的一款 AI 聊天机器人,是世界上最大的语言模型之一,比之前的一些模型如 GPT-3 要强大得多,因此 Claude 被认为是 Ch ...

  5. unity添加Mysql的dll以及发布的问题

    最近在做一个unity项目中,要读取数据库,还是MySql的数据库.遇到了很多问题,写出来供大家参考一下. 关于unity引用第三方的Mysql.data.dll的问题: 这个地方有一个难点,正常的C ...

  6. gateway异常:DefaultDataBuffer cannot be cast to org.springframework.core.io.buffer.NettyDataBuffer

    启动gateway后 出现java.lang.ClassCastException: org.springframework.core.io.buffer.DefaultDataBufferFacto ...

  7. 22.04.1 wine8.10 完美安装同花顺最新版THS_9.20.40_20230613

    Linux luma 5.19.0-45-generic #46~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 7 15:06:04 UTC 20 x86_64 ...

  8. .NET 5 的烦恼

    由于微软工程师的辛勤脑洞和劳作,.NET 生态如何演变完全看他们的决策,其中包含社区吸纳内容.团队讨论结果等等,不乏一些工程师.架构师偏好,很难摸得准.   就比如这一次未来规划,他们希望将 .NET ...

  9. celery笔记九之task运行结果查看

    本文首发于公众号:Hunter后端 原文链接:celery笔记九之task运行结果查看 这一篇笔记介绍一下 celery 的 task 运行之后结果的查看. 前面我们使用的配置是这样的: # sett ...

  10. HCL实验:5.单臂路由实现不同vlan通信

    使用单臂路由实现不同vlan 互通 拓扑图 网关均为所在网段的第一个地址 交换机配置 创建vlan 划分端口 配置端口类型 显示简要信息 路由器配置 路由器的端口默认关闭,需要手动开启 进行子端口的划 ...