攻防世界逆向高手题之re5-packed-movement

99 篇文章 36 订阅
本文探讨了如何破解使用movfuscator混淆的程序,通过IDA工具分析和字节序列搜索,揭示了隐藏在mov指令中的旗标字符,最终找回了ALEXCTF的旗标。涉及的知识包括图灵完备性、mov指令的混淆原理和解混淆技巧。
摘要由CSDN通过智能技术生成

攻防世界逆向高手题之re5-packed-movement

继续开启全栈梦想之逆向之旅~
这题是攻防世界逆向高手题的re5-packed-movement
在这里插入图片描述
下载附件,照例扔入exeinfope中查看信息:
在这里插入图片描述

32位的UPX壳,直接扔入Kali中脱壳处理先:
在这里插入图片描述

照例先运行一下程序,看一下主要的回显信息:
在这里插入图片描述

照例扔入32位IDA中查看伪代码信息,有main函数看main函数,结果没有Main函数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
.
.
.
现在冷静分析一下,关键代码都在main函数中,但是都是Mov指令,这应该是经过某种处理的好像又不是花指令,因为没有数据和其他移位命令,查了查资料,下面是博客大灬白的话:

https://blog.csdn.net/Onlyone_1314/article/details/120928679?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3.no_search_link

我们可以看到程序的汇编代码全都是mov,肯定是被混淆过了,这里是用了movfuscator来混淆,。
.
剑桥大学的Stephen Dolan证明了x86的mov指令是图灵完全的(论文《mov is Turing-complete》)。这意味着从理论上来讲,x86只要有mov这一条指令就可以完成几乎所有功能了(可能还需要jmp),其他指令都是“多余的”。受此启发,有个大牛做了一个虚拟机加密编译器。它是一个修改版的LCC编译器,输入是C语言代码,输出的obj里面直接包含了虚拟机加密后的代码。如它的名字,函数的所有代码只有mov指令,没有其他任何指令。对,完全没有,连call,jz,ret之类的都没有。
  .
  开源项目地址:https://github.com/xoreaxeaxeax/movfuscator
  .
  M/o/Vfuscator(简称“o”,听起来像“mobfuscator”)将程序编译成“mov”指令,并且只编译“mov”指令。算术、比较、跳转、函数调用,以及程序需要的一切,都是通过mov操作完成的;没有自修改代码,没有传输触发的计算,也没有其他形式的非 mov 作弊。
————————————————
版权声明:本文为CSDN博主「大灬白」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Onlyone_1314/article/details/120928679

这类movfuscator 混淆后的程序,MOV混淆是不会混淆函数的逻辑的,因此函数的逻辑还是不变的。大多都是通过逐个比较输入后的字符串的每个字符的方式,比较结果不对就输出“Wrong Flag!”,所以在程序当中就会出现单个的字符,例如:
在这里插入图片描述

这里也是借鉴了大白的两个方法:
方法1:用IDA的字节搜索序列:
在这里插入图片描述
在这里插入图片描述
.
.
方法2:用IDA内嵌的python脚本匹配符合的字符,这里涉及flag的字符范围和简单的匹配算法

start=0x80487c4
end=0x8060B38
flag=""
while start < end:
    if((Byte(start)<=ord('9') and Byte(start)>=ord('0')) or (Byte(start)<=ord('z') and Byte(start)>=ord('a')) or (Byte(start)<=ord('Z') and Byte(start)>=ord('A'))or Byte(start)==ord('!') or Byte(start)==ord('@') or Byte(start)==ord('#') or Byte(start)==ord('{') or Byte(start)==ord('}') or Byte(start)==ord('\'') or Byte(start)==ord('*')  or Byte(start)==ord('&') or Byte(start)==ord('_') ):	#匹配flag的字符范围和部分特殊字符
        if(Byte(start+1)==0 and Byte(start+2)==0 and Byte(start+3)==0):
            flag+=chr(Byte(start))
    start+=1
print(flag)

在这里插入图片描述

去掉2就是flag:ALEXCTF{M0Vfusc4t0r_w0rk5_l1ke_m4g1c}
.
.
.
解毕!敬礼!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐一 · 林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值