常见的干扰逆向分析的技术有花指令、反调试、加壳、控制流混淆、双进程保护、虚拟机保护等技术。
目录
一、花指令
1.定义
花指令只一种保护代码比较简单的方式,其原理是在原始代码中插入一段无用或者能干扰反汇编引擎的代码,这段代码并没有什么功能性作用,只是一种扰乱代码分析的手段。
2.基本思路
花指令主要影响静态分析,在IDA中表现为一些指令无法识别,导致某些函数未能识别,从而无法对这些函数进行反编译。在IDA中手动将花指令patch成nop空指令,可以去除花指令,若二进制程序中的花指令较多,那么可以通过分析花指令的特定模式,编写IDAPython脚本对花指令进行自动化搜索。
3.实例分析
花指令影响IDA反汇编
通过patch去除花指令
进一步分析这个程序,可以得到花指令的指令模式,主要是在某些特定的指令序列之后插入一到两个无用字节,通过IDA脚本自动化去除花指令代码如下:
from idaapi import *
from idc import *
from idautils import *
start_ea = 0x40100
print 'start....'
patterns = [('73,02',2), ('EB 03 ', 1), ('72 03 73 01', 1), ('74 03 75 01', 1), ('7E 03 7F
01', 1), ('74 04 75 02', 2)]
for pattern in patterns:
ea = start_ea
while True:
ea = FindBinary(ea, SEARCH_DOWN, pattern[0])
if ea == idapi.BADADDR
break
ea += len(pattern[0].replace(' ','')/2
for i in range(pattern[1]):
PatchByte(ea+i, 0x90)
MakeCode(ea+i)
二、反调试
反调试是指在程序运行的过程中探测其是否处于被调试状态,若发现其正在被调试,则使其无法正常运行。在Windows下通过OD的strongOD插件可以过滤掉大多数反调试方法,所以一下主要针对Linux。
1.利用ptrace
Linux下的调试主要是通过ptrace系统调用实现的,一个进程只能被一个程序跟踪,所以若程序被跟踪之后再来调用ptrace(PTRACE_TRACEME)自然是不会成功的。
#include <stdio.h>
#include <sys/ptrace.h>
int main (int argc, char * argv[])
{
if (ptrace (PTRACE_TRACEME,0,0,0) == -1)
{
printf ( "Debugger detected\n");
return 1;
}
printf ("OK\n")
return 0 ;
}
2.proc文件检测系统
读取/proce/self目录下的部分文件,根据程序在调试和费调试状态下的文件的不同来进行反调试。例如:/proce/self/status在非调试状态下,则TracePid为0,反之不为0,而是跟踪Pid进程号。
3.父进程检测
通过getppid系统调试用获取得到程序的父进程,若父进程是gbd,strace或者Itrace,则可以证明程序正在被调试。
4.实例分析
直接运行程序时,程序会提示输入密码,但是在gdb中运行时,不会有任何输出,猜测程序有反调试。

本文详细介绍了CTF比赛中常见的逆向分析技术,包括花指令、反调试策略(ptrace、proc文件检测、父进程检测)、加壳技术、控制流混淆、双进程保护(Debug Blocker)以及虚拟机保护。通过对这些技术的深入理解,有助于提高逆向工程和安全分析的能力。


最低0.47元/天 解锁文章
3867

被折叠的 条评论
为什么被折叠?



