在一般的软件中,我们逆向分析时候通常都不能直接看到软件的明文源代码,或多或少存在着混淆对抗的操作。下面,我会实践操作一个例子从无从下手到攻破目标。
花指令对抗
虚函数表
R**
题目载体为具有漏洞的小型软件,部分题目提供源代码,要求攻击者发现并攻击软件中存在的漏洞。
首先拿到这道题目,查壳看架构,elf64
放到虚拟机中运行一下
plz input your flag
8888888888888
wrong
ida64反编译,发现软件进行了去符号处理,最直白就是没有main()函数。
但是ida自动帮我们定位到了系统入口函数start()。
然后我们查字符串 plz、wrong,均无法查到相关字符串
可见程序对静态分析做了很大的操作,防止一眼顶真。
然后我们回到系统入口函数start,F5反编译。
程序无法完全反编译,并且发现init和fini均无法正常识别。
进入main函数,即sub_405559(),无可用信息。
看汇编
很明显,程序做的混淆对抗是加了花指令。
花指令实质就是一串垃圾指令,它与程序本身的功能无关,并不影响程序本身的逻辑。在软件保护中,花指令被作为一种手段来增加静态分析的难度。
花指令关键在于对堆栈变化以及函数调用的操作。强硬的动态调试能力也可以无视花,直接en看。
对于此花指令,我们只需要将call $+5
、 retn
nop 即可
(该软件的每个有用的function都加入了此花指令)
E8 00 00 00 00 call $+5
C3 retn
此时F5反编译,程序明显可读了
我们重命名一下,方便理解
可见程序还使用了虚函数重定位的技术。
下面我们进行动态调试,具体跟进函数。
F7进入
又发现了花,我们nop掉
然后进入下一个函数进行重复的操作
再往下程序结束,但是我们并没有看到密文比较的地方。
我们对rc4的两个函数进行交叉引用,看哪里调用了他们呢
.data.rel.ro
这个节段是只读数据段的重定位段,在链接时重定位,里面放的就是我们的虚函数表。
看到下面还有一个sub_405CAA(),我们点击跟进。
至此,我们找到了程序的所有逻辑。
提取密文
25CD54AF511C58D3A84B4F56EC835DD4F6474A6FE073B0A5A8C317815E2BF4F671EA2FFFA8639957
提取密钥
921C2B1FBAFBA2FF07697D77188C
rc4_enc()函数还有个 ^23
得解。
本文作者:[email protected]
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/205826.html