首页
社区
课程
招聘
[原创]CTF 逆向:基础 VM 的三大解法剖析
发表于: 2025-3-3 20:54 4367

[原创]CTF 逆向:基础 VM 的三大解法剖析

2025-3-3 20:54
4367

前几天,一位学弟发了道很基础的vm题目给我,我自己想用多种思路来解,中间碰壁多次,于是想着写一篇博客分享下碰壁过程以及关于vm题型我自己的一些解法

一、VM 核心原理速览

vm题型简介

程序大多会有自己一套循环的执行程序流
大致长相为

1
2
3
4
5
6
7
while(i<len(opcode)):
    if(opcode[i]==0x00):
        i+=1
    elif(opcode[i]==0x01):
        i+=2
    elif(opcode[i]==0x02):
        i+=3

其中opcode一般情况是由操作数和操作组成的一大串数据(通常由成百上千个byte组成)
说白了就是其中的加密过程很多,我们需要模拟执行流

破局思路

关键定位:虚拟指令分发器(opcode)
加密逻辑:找到他的循环加密
模拟重建:模拟执行流进行爆破或者解密

二、三种解法

解法一:传统手撕

将整个执行流程保存下来,倒着用enc去回到flag

解法二:正向Z3

模拟加密过程,使用Z3约束求解来得到flag

解法三:通过gbd或者frida插桩爆破

因为单字节或者双字节的缘故,所有可能也不过那么几样,我们通过一些手段可以实现爆破程序得到flag

高难度vm

2024年强网杯就有一道vm,对我来说很难
找不到opcode和中间的执行流
这种题我目前的想法也只会无脑的爆破程序,不出也不会了,硬看经常大脑卡死
(大佬轻松手撕)

三、解题

前言

解题前放两位大佬关于vm的博客,我也是跟着学的~
upsw1ng佬关于vm的博客
swdd佬关于利用frida去插桩爆破的博客

前面两种方法


[注意]看雪招聘,专注安全领域的专业人才平台!

最后于 2025-3-3 22:41 被namename123编辑 ,原因: 有个没有加载出来的图片
上传的附件:
收藏
免费 5
支持
分享
最新回复 (7)
雪    币: 142
活跃值: (10282)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
2
shift+8 还纳闷啥快快捷键.一看 尼玛不就是 数组 *号键 
2025-3-4 17:44
0
雪    币: 204
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
TkBinary shift+8 还纳闷啥快快捷键.一看 尼玛不就是 数组 *号键[em_056]
笑死,我看了半天也在下这啥快捷键。。。
2025-3-5 09:32
0
雪    币: 142
活跃值: (10282)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
4
逆向小玖 笑死,我看了半天也在下这啥快捷键。。。
2025-3-5 09:39
0
雪    币: 239
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
TkBinary shift+8 还纳闷啥快快捷键.一看 尼玛不就是 数组 *号键[em_056]
我是菜狗~只知道这样按可以
2025-3-5 12:34
0
雪    币: 807
活跃值: (1059)
能力值: ( LV5,RANK:73 )
在线值:
发帖
回帖
粉丝
6

感谢楼主分享,这里也补充一种方法
大部分的VM题目的opcode均模拟汇编指令,或者可以用一条或几条x86指令等价表示。所以可以识别出每一条opcode对应的x86指令,将其转化为对应的x86汇编,用编译出bin文件,最后IDA反编译bin文件得到伪代码。在一些复杂算法的VM上这种方法的还原效果会比较好
如2021年L3HCTF的double-joy: L3HCTF double-joy引出的解VM类题型新思路

最后于 4天前 被Qfrost编辑 ,原因:
4天前
1
雪    币: 239
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
Qfrost 感谢楼主分享,这里也补充一种方法大部分的VM题目的opcode均模拟汇编指令,或者可以用一条或几条x86指令等价表示。所以可以识别出每一条opcode对应的x86指令,将其转化为对应的x86汇编,用编 ...
佬!
3天前
0
雪    币: 105
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
Qfrost 感谢楼主分享,这里也补充一种方法大部分的VM题目的opcode均模拟汇编指令,或者可以用一条或几条x86指令等价表示。所以可以识别出每一条opcode对应的x86指令,将其转化为对应的x86汇编,用编 ...
膜拜!!!感谢分享
2小时前
0
游客
登录 | 注册 方可回帖
返回