0x00 前言

花指令

花指令又称脏字节,英文为”junkcode”,顾名思义,即在程序中加入的一些垃圾指令,其目的是在不妨碍原有程序执行的前提下,阻碍程序反编译,增加静态分析难度,隐匿不想被逆向分析的代码块,混淆代码,绕过特征识别。

花指令总结_Captain_RB的博客-CSDN博客_花指令

C++异常处理

C++异常处理源码与安全性分析_ashimida@的博客-CSDN博客_eh_frame段

try-catch

如果在try语句块的程序段中(包括在其中调用的函数)发现了异常,且抛弃了该异常,则这个异常就可以被try语句块后的某个catch语句所捕获并处理,捕获和处理的条件是被抛弃的异常的类型与catch语句的异常类型相匹配。

catch(c++异常处理)_百度百科

1
2
3
4
5
6
7
8
try
{
//程序中抛出异常 throw value;
}
catch(valuetype v)
{
//例外处理程序段
}

10cc5825ce374afd86f1cfb87cc5c691.jpg

0x01 landing

查壳 64位无壳PE文件

fcd2a4f50ecbd4130711062b9e6b0d8.png

IDA反编译一下主函数

4ac251f3cb3ba369f3b6d69b19d7e7c.png

找到关键函数func1

2f76d147dbd2395c449c213539841b0.png

分析一下可知func1函数给出了一段base64加密的密文

解出来是一个假的flag

1
2
3
4
5
6
7
8
9
import base64
str_1 = "TFd+TFJ+RH5FREpIfkVPREZ+S0RLREtES0RLRA=="
str_base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
str_zh_base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
flag = base64.b64decode(str_1.translate(str.maketrans(str_base,str_zh_base)))
print(flag)


# LW~LR~D~EDJH~EODF~KDKDKDKDKD

再分析一下func1函数,定位到func2函数

1
2
3
4
5
6
7
8
void __fastcall __noreturn func2(char *a1)
{
_QWORD *v1; // rax

v1 = _cxa_allocate_exception(8ui64);
*v1 = a1;
_cxa_throw(v1, refptr__ZTIPc, 0i64);
}

可以看到有个_cxa_throw 抛出异常

顺着调用链寻找catch块 发现在main函数里

966502f55d48e98d7faced0b4832c30.png

在主函数中jmp一下得到真正的验证段

08802c0b2729fa1d91aa67ba20a2491.png

640.png

分析一下,定位到nothing函数

1
2
3
4
void _fastcall nothing(char *a1,const char *a2)
{
JUMPOUT(0x401984i64);
}

有一段花指令 

手动清除一下 将花指令设置为nop(0x90)或用快捷键D将其设置为数据类型

然后就可以看到真正的加密函数

640 _1_.png