(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) 实现的独立性和相互 ...
随机推荐
- 让ChatGPT帮我写SQL
推荐一个Github上Start超过3.4K,可将自然语言转化为SQL语句的开源项目. 项目简介 这是一个利用ChatGPT,SQL与自然语言的翻译器.可以将自然语言转换为SQL语句,同样也可以把SQ ...
- 代码随想录算法训练营Day48 动态规划
代码随想录算法训练营 代码随想录算法训练营Day48 动态规划|198.打家劫舍 213.打家劫舍II 337.打家劫舍III 198.打家劫舍 题目链接:198.打家劫舍 你是一个专业的小偷,计划偷 ...
- 智慧饮水系统_Android客户端
智慧饮水系统(又名:水牛 APP) 1.介绍 该项目基于 Rfid-RC522.ESP-32 进行下位机开发,硬件模块 Rfid-RC522 主要读取用户的卡号,ESP32 单片机通过 WiFi 模块 ...
- python mitmproxy抓包库
一.简介 mitmproxy是一款用Python编写的支持HTTP(S)的中间人代理工具.它可以拦截.查看.修改.重放和保存HTTP/HTTPS流量 ,支持命令行界面和图形界面,可用于安全测试.网络调 ...
- 使用CNI网络插件(calico)实现docker容器跨主机互联
目录 一.系统环境 二.前言 三.CNI网络插件简介 四.常见的几种CNI网络插件对比 五.Calico网络之间是如何通信的 六.配置calico让物理机A上的docker容器c1可以访问物理机B上的 ...
- SQL专家云快速解决阻塞
背景 当数据库突然产生严重阻塞时,运维人员要快速找到阻塞的源头并处理,让业务快速恢复.但是大多数运维人员只掌握了sp_who2.sp_lock等简单的语句,存在以下不足: 找不到真正的源头,过程中会误 ...
- 洛谷 P8026 [ONTAK2015] Bajtocja
简要题意 有 \(d\) 张初始为空的无向图,每张中都有 \(n\) 个点,标号从 \(1\) 到 \(n\),\(m\) 次操作,每次往一张图加一条边,并询问有多少有序数对 \((a, b)\) 使 ...
- idea设置退出软件提示
进入设置
- 常见的Web安全攻击类型及其应对方法
目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 5. 优化与改进 6. 结论与展望 7. 附录:常见问题与解答 常见的Web安全攻击类型及其应对方法 随着网 ...
- kafka学习笔记01
类似于京东商城这种电商系统,一般会在前端页面进行埋点记录仪用户的行为数据,包括浏览.点赞.收藏.评论等.这些行为会被记录到日志服务器中,使用Flume进行采集,然后传入Hadoop中. Flu ...