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)相关推荐

  1. sus 逆向 writrup

    东南的平台又放了新题,这次决定都做一下试试,在这里记录解题过程,因为是平时练习,我会尽可能多的把思路和解法写全,鉴于东南平台的wp不是很多,也方便下一届萌新的自主练习.平台地址:http://sus. ...

  2. 正向最大匹配 和逆向最大匹配对比比较

    正向最大匹配法 &逆向最大匹配法 原理对比 下面介绍的分词算法中最简单的正向最大匹配和反向最大匹配. 这种两种方法都是机械分词方法,它是按照一定的策略将待分析的汉字串与一个"充分大的 ...

  3. 同向逆向、多车道线检测

    同向逆向.多车道线检测 输入输出接口 Input: (1)左右两个摄像头采集的实时图像视频分辨率(整型int) (2)左右两个摄像头采集的实时图像视频格式 (RGB,YUV,MP4等) (3)摄像头标 ...

  4. asp.net webform 复制窗体代码_逆向分析流氓软件自我复制以及防御思路

    一.前言 好长时间没有投稿了,之前被发布的稿件,也收到了Freebuf的现金奖励,同时陆陆续续收到好多圈类人士的夸奖,备受鼓舞,觉得自己应该坚持投稿,为安全事业略尽绵薄之力!最近任务不重,正好有时间投 ...

  5. iOS逆向(1)——利用ipa重签名,3分钟iPhone安装多个微信

    本文要达成如图效果,在一台iPhone上安装第二个微信: 准备: Xcode 微信ipa(可通过iTool进行下载) 重签名脚本 步骤 打开Xcode,新建Single View App项目,名字可以 ...

  6. iOS逆向(4)-代码注入,非越狱窃取微信密码

    利用LLDB对微信进行分析,然后利用分析的结果,再逐步讲解如何Hook微信的登录过程,截获微信密码. 在上一篇文章(APP重签名)中,已经介绍了如何对APP重签名,并且利用XCode将微信跑起来,既然 ...

  7. android逆向分析概述_Android存储概述

    android逆向分析概述 Storage is this thing we are all aware of, but always take for granted. Not long ago, ...

  8. Android逆向--如何调试smali代码?

    最近在重整Android逆向分析环境,一切都在从零开始,做下记录,给大家分享. 本文介绍Android逆向中smali代码的调试及环境的准备. 事先准备如下工具: Android killer:反编译 ...

  9. Android逆向之调试smali代码基础

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 介绍Android逆向中调试smali代码的方法." 最近在重整Android逆向分析环境,一切都在从零开始,做下记录,给大家分享 ...

最新文章

  1. oracle数据库按照城市分组_大数据分组怎样才会更快
  2. POJO、VO、PO、FormBean区别:
  3. python3.7安装turtle步骤-Python怎么引入turtle
  4. js全局变量和局部变量
  5. Verilog MIPS32 CPU(一)-- PC寄存器
  6. 无向图缩点:tarjan点双与边双缩点(模板)
  7. PHP Cookie处理
  8. mysql info commit_mysql show processlist 发现大量的commit
  9. 信息学奥赛一本通(1177:奇数单增序列)——比较排序
  10. 云图说丨“真人?机器?傻傻分不清!” WAF Bot管理,带你慧眼辨“精”!
  11. 4thweek.P_problemB .poj1505copy books.二分法
  12. 可塑性极强渐变几何空间,设计中不可或缺的素材
  13. 火狐浏览器走局域网中的代理ip
  14. 数据科学家教你用数据模型来泡妞
  15. java setcharat,Java StringBuilder setCharAt()方法
  16. DevExpress Dashboard for .NET简化商业智能开发
  17. jquery下的this,$(this),$(this).get(0);
  18. heic格式转化jpg方法
  19. 看你想看的,不受打扰地工作(浏览器屏蔽百度热搜)
  20. 今天看到居民负债率超过90%

热门文章

  1. 《演化学习:理论和算法的进展》
  2. 今日份CSS学习:font的相关属性
  3. 对于初学者,本文为您提供了对机器视觉的全面理解
  4. ssm基于安卓的健康体检预约系统APP-计算机毕业设计
  5. arm平台linux的ethtool配置,ARM-Linux驱动--DM9000网卡驱动分析(四)
  6. GPL与BSD的区别
  7. 分享一个好东西(一天精通MongoDB数据库)
  8. linux 替换文件中的字符串——sed
  9. CentOS彻底删除MySQL
  10. C语言 干支纪年查询(已验证1900-2100)