flower是花指令,花指令是什么?其实就是插入垃圾指令,我好不容易写出的程序怎能让你这么轻易的逆出来。所以我们要通过修改汇编去破除花指令。
我们不妨想一下哪里能插入垃圾指令。你看jmp跳转以及call指令等等地方都是不二之选。
在了解花指令之前,我们先要学习ida的反汇编机制。
1 线性扫描算法,线性一条流水线上的,想想c语言的线性顺序,类比一下这就是从头到尾扫描,都解释为指令,这就使其如果遇到数据也可能错误反汇编,在反汇编代码中插入数据,反汇编就会失败。
2 递归下降算法,其根据可能执行的逻辑进行反汇编,一般是在遇到分支跳转和call指令时发挥作用,jmp指令其就不会看jmp与跳转到的地址中间的汇编代码,而例如jz等条件跳转其就会分析两条路径(跳转与不跳转)。
花指令(可以在main函数中也可以在主函数之前)的基本类型拥有以下几种
1 插入无关指令
(1)就如调用一些无用的寄存器
add eax, ebx
push eax
其就可以插入一个无用的ecx寄存器去干扰你的静态分析
(2)插入无关数据是ida错误解析(可变长度指令,不同指令有不同长度)(这类解法是将无关数据nop掉)
就比如 jmp local()
80 90 65 (垃圾指令)
local :
2 分支跳转 (由于递归下降算法,条件跳转需要分析两条路)这类解法是将无关数据nop掉
xor eax,eax(自身异或一定为0)
cmp eax , 0
je local_3
junk code(导致反汇编失败)
local 3
当然还有jz与jnz(永真)跳转到同一个地址。这个也与上面的花指令手法差不多
3 间接跳转
call $+5 ->$为当前地址,位置无关指令仅是跳转到下一个页面。
pop rax (相当于将此地的地址存在rax寄存器中)
add rax, 10
jmp rax
由于ida的静态分析无法识别出rax寄存器储存的动态地址,导致其跳转错乱,没法讲正确的指令解析出来。
解决方法:将call 一直到rax存的地址之前的全nop掉
4 内部跳转
local_2 E9 78 80 jmp local_2 +1(有跳到内部了)
解决方法很简单 将机器码中的第一个地址存的E9 nop掉
5 破坏栈平衡 (调用前与调用后需要栈平衡,即调用前与调用后) ->call(相当于push+jmp)ret(相当于pop+jmp)
(1)xor eax, eax
jz s
s: add esp, s->可以插入垃圾指令了
(2)
movl countine, esp
ret->(此时仅仅只会跳转到countine位置,而并不会返回原位置)
第一回用blog分享所学的知识,还不会插入图片,下回我会学插入图片的,写的也不够好,请包容。写博客确实并非易事,猫写完都得累趴下,