171109 逆向-SWPU(re400)
1625-5 王子昂 总结《2017年11月9日》 【连续第405天总结】
A. 08067CTF-re400
B.
这次的程序是VMP保护的……正好从来没接触过,练习一发0v0
首先查壳,无反应
看来VMP只保护了核心部分的代码啊
拖入IDA反编译:
耿直的超乎寻常的流程……
要求输入为16个字符
将输入转成int数组后通过sub_401120进行check
然而这个call里面就全是乱码了,看来这就是关键的VMP啦
首先去下来VMP分析插件(看雪和吾爱都有)
拷到OD目录下以后重启即可
右键关键call,选择分析虚拟机,然后选择分析虚拟程序
选择插件-VMP分析插件-打开调试窗口
就可以看到虚拟机指令窗口啦
这里面每一行都是原汇编分析出的对应虚拟机指令
虽然指令还是虚拟机插件作者所自创的指令,但至少比起原来不明所以的汇编清晰多啦
POP、Add等指令都是熟悉的指令,如果还有不理解的指令可以去看雪/吾爱/压缩包内的说明文档找~(我就没想通SubFlag啥意思qaq
现在还比较迷茫,我们再进行两步就能够得到最精简的代码了:
右击-查看-表达式
右击-查看-最终操作
既去除了无关和复杂操作,又给出了清晰易懂的表达式,让我们仰慕一下插件作者OTZ
到这里基本上就可以等价于汇编了,ReadMemDs就是从输入中读出值,右边表达式中的vx是指左边Pop指令对应的vRx寄存器,mx则是临时变量(我也不知道在哪儿~只能从值对应猜啦)
可以看到,代码依次读入每个字符,进行了一番左移操作后累加了起来
其实稍微计算一下就能看出来就是sum = sum*10 + input[i]
用这么神奇的表示方法大概是因为虚拟机中没有乘法指令,于是就优化成各种左移和加法了吧。
不过汇编中的乘法指令落到CPU底层上的实现应该也是各种左移和加法吧-0-毕竟都是二进制数嘛
16个字符共进行了4次如上循环,切分成4个四位数
然后对它们进行运算校验
这里貌似也没什么好方法,只能慢慢计算了
注意一共有4次校验,最后一次没有通过vJmp来跳转,而是直接使用了Flag标志位:
这个SubFlag就是校验v37-0xBB80是否为0的,通过最后的标志位来表达在外部的返回值中,因此也要求通过
最后总结出4个方程:
这个计算起来有点麻烦呀……
想起来之前刚好搞了Z3约束求解器下来,这东西解方程正好用嘛
安装的时候又费了好大劲,pip安装下来的貌似不太对劲,还是得乖乖去github上拖
弄下来以后又报初始化错误,然后把libz3.dll放进去,再核对32位和64位版本后才终于能用=A=
python3:
import z3z3.init(r"E:\Users\hasee\AppData\Local\Programs\Python\Python35-32\Lib\site-packages\libz3.dll")solver = z3.Solver()
v11 = z3.Int('a')
v16 = z3.Int('b')
v19 = z3.Int('c')
v23 = z3.Int('d')
# 限制解的范围
solver.add(v11 < 9999, v16 < 9999, v19 < 9999, v23 < 9999)
solver.add(v11 > 0, v16 > 0, v19 > 0, v23 > 0)
# 添加方程
solver.add(v11 * 5 + v19 * 3 + v23 * 2 + v16 * 4 == 0x130D9, v11 * 4 + v16 * 2 + v19 * 6 + v23 * 3 == 0x10aef,v11 * 3 + v16 + v19 * 7 + v23 * 5 == 0x11a6b, v11 * 2 + v16 * 3 + v19 * 5 + v23 == 0xbb80)
# 求解
if (solver.check() == z3.sat):print(solver.model())
else:print("unsat")
注意Z3默认情况下是只输出一个解的,因此如果方程约束条件不对的话将只能得到错误解╮(╯_╰)╭
输出解后按照顺序将其拼合成字符串即可
总的来说这个VMP还是挺简单的,作为学习工具来讲非常好~
萌新首次接触VMP就很快搞定啦~
再次感谢SWPU和08067的师傅们~
C. 明日计划
刷pwn去=A=
171109 逆向-SWPU(re400)相关推荐
- sus 逆向 writrup
东南的平台又放了新题,这次决定都做一下试试,在这里记录解题过程,因为是平时练习,我会尽可能多的把思路和解法写全,鉴于东南平台的wp不是很多,也方便下一届萌新的自主练习.平台地址:http://sus. ...
- 正向最大匹配 和逆向最大匹配对比比较
正向最大匹配法 &逆向最大匹配法 原理对比 下面介绍的分词算法中最简单的正向最大匹配和反向最大匹配. 这种两种方法都是机械分词方法,它是按照一定的策略将待分析的汉字串与一个"充分大的 ...
- 同向逆向、多车道线检测
同向逆向.多车道线检测 输入输出接口 Input: (1)左右两个摄像头采集的实时图像视频分辨率(整型int) (2)左右两个摄像头采集的实时图像视频格式 (RGB,YUV,MP4等) (3)摄像头标 ...
- asp.net webform 复制窗体代码_逆向分析流氓软件自我复制以及防御思路
一.前言 好长时间没有投稿了,之前被发布的稿件,也收到了Freebuf的现金奖励,同时陆陆续续收到好多圈类人士的夸奖,备受鼓舞,觉得自己应该坚持投稿,为安全事业略尽绵薄之力!最近任务不重,正好有时间投 ...
- iOS逆向(1)——利用ipa重签名,3分钟iPhone安装多个微信
本文要达成如图效果,在一台iPhone上安装第二个微信: 准备: Xcode 微信ipa(可通过iTool进行下载) 重签名脚本 步骤 打开Xcode,新建Single View App项目,名字可以 ...
- iOS逆向(4)-代码注入,非越狱窃取微信密码
利用LLDB对微信进行分析,然后利用分析的结果,再逐步讲解如何Hook微信的登录过程,截获微信密码. 在上一篇文章(APP重签名)中,已经介绍了如何对APP重签名,并且利用XCode将微信跑起来,既然 ...
- android逆向分析概述_Android存储概述
android逆向分析概述 Storage is this thing we are all aware of, but always take for granted. Not long ago, ...
- Android逆向--如何调试smali代码?
最近在重整Android逆向分析环境,一切都在从零开始,做下记录,给大家分享. 本文介绍Android逆向中smali代码的调试及环境的准备. 事先准备如下工具: Android killer:反编译 ...
- Android逆向之调试smali代码基础
点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 介绍Android逆向中调试smali代码的方法." 最近在重整Android逆向分析环境,一切都在从零开始,做下记录,给大家分享 ...
最新文章
- oracle数据库按照城市分组_大数据分组怎样才会更快
- POJO、VO、PO、FormBean区别:
- python3.7安装turtle步骤-Python怎么引入turtle
- js全局变量和局部变量
- Verilog MIPS32 CPU(一)-- PC寄存器
- 无向图缩点:tarjan点双与边双缩点(模板)
- PHP Cookie处理
- mysql info commit_mysql show processlist 发现大量的commit
- 信息学奥赛一本通(1177:奇数单增序列)——比较排序
- 云图说丨“真人?机器?傻傻分不清!” WAF Bot管理,带你慧眼辨“精”!
- 4thweek.P_problemB .poj1505copy books.二分法
- 可塑性极强渐变几何空间,设计中不可或缺的素材
- 火狐浏览器走局域网中的代理ip
- 数据科学家教你用数据模型来泡妞
- java setcharat,Java StringBuilder setCharAt()方法
- DevExpress Dashboard for .NET简化商业智能开发
- jquery下的this,$(this),$(this).get(0);
- heic格式转化jpg方法
- 看你想看的,不受打扰地工作(浏览器屏蔽百度热搜)
- 今天看到居民负债率超过90%