前言
知识点
花指令
ida汇编
python
题目
下载题目附件解压后拖入ida并f5查看
发现主函数无法编译,考虑是花指令
思路
知识补充
花指令
实质就是一串垃圾指令,它与程序本身的功能无关,并不影响程序本身的逻辑。在软件保护中,花指令被作为一种手段来增加静态分析的难度,花指令也可以被用在病毒或木马上,通过加入花指令改变程序的特征码,躲避杀软的扫描,从而达到免杀的目的
一般最常见的就是在机器码中加入 E8,E8 加入后会将汇编代码改变为 CALL,而后续的机器码代表的东西是没有意义的,不是一个函数,所以 CALL 之后反编译器无法识别
IDA汇编/机械码
jmp
相应的机器码EB
绝对跳,无条件跳,从而跳过下面的出错信息
nop
相应的机器码90
抹掉这个跳转,使这个跳转无效,失去作用,从而使程序顺利来到紧跟其后的正确信息处
IDApython
在IDA中File->Script file引入pyhton脚本以执行
startaddr
:初始地址
endaddr
:结束地址
get_wide_byte()函数
:转变为数据(byte)
patch_byte()函数
:设置字节值
操作
打开start中的main函数,可见存在大量jmp跳转使程序无法正常编译
观察起始地址,结束地址和jmp的机器码
需将EB FF
全部换成90
,即jmp->nop(将其转换成空指令)
于是编写python脚本在ida中运行
startaddr=0x1135
endaddr=0x3100
for i in range(startaddr,endaddr):
if get_wide_byte(i)==0xEB:
if get_wide_byte(i+1)==0xFF:
patch_byte(i,0x90)
然后一路翻下去可以找到flag的字符
GCTF{u_are2wordy}
非预期解
打开hex-view就能找到(
总结
初步了解花指令
学习使用IDA python脚本
学习机器码