在做攻防世界的echo-server这道题的时候,又碰上了花指令,之前就没太搞懂现在再来学习一下。
什么是花指令
花指令是指由于设计者特别构思,希望使反汇编的时候出错,让破解者无法正确地反汇编程序的内容,迷失方向。比较经典的是,目标位置是另一条指令的中间,这样在反汇编的时候便会出现混乱(因为正常来说发生跳转时,跳转的目标位置都会是在另一条指令或者另一个函数的开头,这样才能正常运行下去)。花指令有可能利用各种指令:jmp,call,ret的一些堆栈技巧,位置运算等等。
常见花指令
机器码 | 汇编语言 |
---|---|
9A | CALL immed32 |
E8 | CALL immed15 |
E9 | JMP immed16 |
EB | JMP immed8 |
放在具体的代码中,IDA中会有红色的代码段,并且大概率会出现
call lab_xxx + 一个数字
JMP lab_xxx + 一个数字
这两种情况,利用IDA中c(to code)和d(to data)以及a(to string)这些快捷键可以在code、data和string三种格式中进行转换,如果在转换为data的过程中出现了上述的4种常见的机器码就可以考虑将其patch掉,也就是利用0x90(nop)去替换掉上述的4种机器码。
如何去除花指令
step 1:
识别哪些数据时有用的数据,哪些是垃圾数据。
step2:
把垃圾数据利用IDA的patch功能用nop(0x90)填充。
IDA中出现”sp-analysis failed”
IDA官网解释:
大意是ida检测到,IDA有栈跟踪的功能,它在函数内部遇到ret(retn)指令时会做判断:栈指针的值在函数的开头/结尾是否一致,如果不一致就会在函数的结尾标注”sp-analysis failed” 。一般编程中,不同的函数调用约定(如stdcall&_cdcel call)可能会出现这种情况;另外,为了实现代码保护而加入代码混淆(特指用push/push+ret实现函数调用)技术也会出现这种情况。
具体例题可以参见攻防世界的echo-server writeup,这道题还不错。
该题的详细wp如下:https://blog.csdn.net/weixin_45225566/article/details/112321692