Sma11_Tim3's Studio.

关于花指令

字数统计: 579阅读时长: 2 min
2021/11/10 Share

在做攻防世界的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官网解释:

20210107165827284

大意是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

CATALOG
  1. 1. 什么是花指令
  2. 2. 常见花指令
  3. 3. 如何去除花指令
  4. 4. IDA中出现”sp-analysis failed”