本日复盘
T1: MRCTF2019 Re/Shit
PE —— 导入地址表(IAT)
逆向时能直接看到源代码的题目还算比较少见,程序用到了PE中的IAT,花指令,而且如果源代码里没有decode函数的话,解密算法肯定也是一道难关= =。
1 |
|
IAT就是导入地址表,包含可执行程序所需的导入函数的地址,在之前虽然学习过PE相关知识,但是实践太少,看了一会才明白代码的意思。
代码中initHook函数就是获得IsDebuggerPresent函数的地址,update函数用于获取IAT表中为IsDebuggerPresent函数的那一项的地址,最后writeAddr函数将表中那一项的值修改为参数addr的值。
在上述代码中,虽然调用的是IsDebuggerPresent函数,但实际上是editedIsDebuggerPresent被执行。
花指令
花指令不同于打乱符号等一些混淆技术,它通过在一段汇编指令中添加一些无关、无意义的汇编指令,打乱了反汇编器的解析。
emm感觉花指令硬编码、栈平衡这方面内容的熟悉程度要求比较高,以前做题是遇到花指令要么看别人怎么做,要么用一些套路,虽然最后做出来了也不知道原理。
代码中的伪指令_emit 0xE8
就相当于IDA Pro中的DB 0xE8
。(写E8其实就是为了迷惑人,让人以为是一个call…= =)
但是本题直接给了源码,出题人的思路已经可以直接看出,硬编码的知识变得不太重要。这里我们就题论题,说一说函数和栈。
对于一个函数来说,能正常地调用并返回最重要的一点就是最后要栈平衡(我说最重要就是最重要= =,别喷我)。对栈进行修改的方法:1. push、pop 2. 对ebp、esp直接修改(mov、add、sub…) 3. call、ret 。
将这三种方法配合jmp、条件判断(test、cmp、jne…)、db dw dq等等一起使用,能更好的达到混淆的目的。
本题花指令部分模拟代码
1 |
|
其中的:
1 | _asm |
即为花指令。
在IDA中查看test函数
1 | .text:00412470 ; int __cdecl test() |
下一步就是将 0EBh, 5
这段解析为汇编指令嗷。
变成了这样:(局部代码)
1 | .text:00412487 call loc_41248F |
这样只是找到了真正会执行的汇编指令,(当然你的IDA让程序走一遍最后也能得到上面的结果,我也这样做)。
下一步就是去除花指令,直接把上面出现的所有指令nop掉。
1 | .text:00D42470 ; int __cdecl test() |
IDA 终于能舒服地F5了。
WEB/枯燥的抽奖
考察了一个伪随机数,看了看php_mt_seed.c的源码,很多SIMD、AVX、MIC之类的知识,太菜了以后看= =。
Web Hook
本来以为这个暑假没啥开发的事了,现在有了个Web Hook加QQBot的需求,想边学Spring边开发。
Yapi RCE漏洞
人畜无害的RCE,主要是放Docker里面了,还不知道怎么扩大影响(除了sudo rm -rf /*
)。要是在非Docker环境下估计就炸了,这就是某du的开源项目吗= =。
Windows 内核与驱动
没错,今天忘了学了,明天补上。(编译原理今天也没看,淦)
又水了个博客,美滋滋= =。
溜了溜了,身体要紧。
(2021-07-14)