逆向工程入门

逆向工程 REVERES

交流逆向工程相关知识 +Q1906661021
后续文章:https://blog.csdn.net/m0_46276093/article/details/121224223
首发于 Th0r安全公众号

1.逆向工程简介及发展方向

软件逆向工程是一种探究应用程序内部组成结构及工作原理的技 术. 运用逆向分析技术, 窥探程序内部结构, 掌握其工作原理.

– 《逆向工程核心原理》

逆向工程,顾名思义,将已经完成的程序经行反编译以找到其内部隐藏细节的过程,我们将其称之为逆向工程

第一步,我们将通过各种信息收集工具,对要进行逆向分析的程序进行信息处理

第二步,我们将存在保护的目标程序经行去加密,并且备份其源文件

第三步,将目标程序拖入静态分析或动态调试软件中经行处理(代码审计或debug)

第四步,对收集到的信息进行整合,给目标程序打补丁,实现我们的目的

请添加图片描述

在CTF比赛中

逆向工程是CTF比赛中一个重要的方向

涵盖了Windows逆向,Linux逆向,Android逆向,密码学逆向等诸多方面,对程序代码进行审计,在关键的位置为程序打上补丁,绕过一些复杂的花指令,逆向工程无疑是最具技术含量的工作,但也因为其本身难度之高,一个好的逆向手是团队中最稀缺的人才。

逆向工程还是pwn方向的前置知识储备

所谓“知己知彼,百战不殆”,如果说pwn是信息安全世界中最锋利的武器,那逆向工程就是帮助它识破敌人弱点的锐利眼眸。在进行数据溢出攻击之前,我们要用逆向工程的手法,分析目标程序,找到其关键弱点,一击致命。我们可以说逆向是为pwn服务的工具,也可以说pwn是长了牙齿的逆向工程。

密码学逆向的独特之处

CTF中,有一部分逆向工程的题目,其本身流程并不复杂,但用到了高级的密码学加密方式,我个人称这种逆向题目为“密码学逆向”,不需要你有很高的程序阅读能力,但是要找出是哪种加密方式,有怎样的特征值,却是个极其艰巨的任务,所以在遇到这种题目的时候,逆向手往往要和密码学方向合作或者自学密码学。

请添加图片描述

以上三点也是比赛中逆向工程细分后,供大家选择的三个方向:代码审计逆向,PWN逆向,密码学逆向

在现实生活中

破解软件的基本原理

软件的破解版,它们都是怎么来的?又是进行了怎样的操作才把复杂的验证机制无效化?

答案是逆向工程

在破解软件时,需要借助各种方法,绕过软件本身自带的自我验证机制,和通过后台服务器的网络验证机制

给软件打上补丁,白嫖free XD

病毒防范,“亡羊补牢”

杀毒软件的病毒库是怎么构建的?截获病毒后该如何处理?

答案还是逆向工程

当电脑受到病毒入侵后,保留完整病毒样本,并对他们进行功能和逻辑分析,找出其特征值,对其进行封装隔离;找到其主要攻击的位置预防下一次攻击时可能的数据丢失。

虽是亡羊补牢,可能也为时未晚

2.主要逆向工具

各种逆向工具简介

1.编码转换及解密工具

编码转换工具是信息安全中最常用的工具,因为题目所给出的“答案”为了迷惑我们,经常会使用编码的方式,隐藏在大量垃圾信息中,防止被轻易发现,因此我们需要对某些有特定编码规则的字符串经行编码转化。

解密工具,因为有密码学逆向的存在,我们需要去熟悉某些特定的解密方法,并以软件和网站来辅助我们的解密过程

2.文件类型及查壳

判断文件类型及查壳工具能帮助我们在开始逆向进行必要的信息收集,帮助我们选择正确的反编译及反汇编工具

3.去保护

根据之前收集的信息,为之后的代码审计做准备,使用相关工具和手段尽可能去除软件的反编译保护

4.静态分析

静态分析软件一般采用线性扫描和递归遍历的方法,将已经经过编译器编译过生成的可执行文件,反编译成汇编代码或伪C语言代码,在静态分析这个步骤中,我们将使用静态分析软件进一步深入收集目标程序的信息,对目标程序进行修改,理解目标程序的实现逻辑。静态分析和动态调试是逆向工程的主体部分

5.动态调试

动态调试是逆向工程中的杀手锏,无论多复杂困难的题目,你都能在动态调试中找到解决它的办法,但动态调试软件同样也是逆向工程中最难上手的软件,通过对逆向深入的学习,当你能熟练地掌握汇编语言基础和动态调试工具的使用后,你就是一个合格的逆向手了。

3.Windows逆向

Windows逆向工具

在开始讲解Windows逆向的具体流程之前,我们先来了解一下我们需要用到的工具

CaptfEncoder

CaptfEncoder是一款跨平台网络安全工具套件,提供网络安全相关编码转换、古典密码、密码学、特殊编码等工具,并聚合各类在线工具

请添加图片描述

HexEdit

HexEditXP是一款实用的文本、代码编辑工具,多用于二进制、十六进制文本的编辑操作,拥有编辑磁盘文件、编辑大型文件、颜色高亮、添加书签以及对指定内容进行复制、粘贴、替换等操作,软件还内置了脚本编辑器功能,方便开发者使用

请添加图片描述

ExeinfoPe

Exeinfo PE是一款查看PE文件信息的工具,可以查看EXE/DLL文件的编译器信息、是否加壳、入口点地址、输出表/输入表等等PE信息,帮助开发人员对程序进行分析和逆向

请添加图片描述

die

Detect it Easy是一个多功能的PE-DIY工具,主要用于壳侦测。功能正日益完善,是不可多得的破解利器,支持文件直接拖放,可添加到右键菜单,非常方便!Die和peid一样可以加载插件

请添加图片描述

FFI

File Format Identifier(超级巡警病毒分析)是一款查壳脱壳工具,同时也是一款病毒分析工具,它可以自动识别文件格式,使用超级巡警的格式识别引擎,集查壳、虚拟机脱壳、PE文件编辑、PE文件重建、导入表抓取(内置虚拟机解密某些加密导入表)、进程内存查看/DUMP、附加数据处理、文件地址转换、PEID插件支持、MD5计算以及快捷的第三方工具利用等功能,适合病毒分析中对一些病毒木马样本进行系统处理。

请添加图片描述

IDA PRO

交互式反汇编器专业版(Interactive Disassembler Professional),人们常称其为IDA Pro,或简称为IDA。是最棒的一个静态反编译软件,为安全分析人士不可缺少的利器!IDA Pro是一款交互式的,可编程的,可扩展的,多处理器的,交叉Windows或Linux WinCE MacOS平台主机来分析程序, 被公认为最好的花钱可以买到的逆向工程利器。IDA Pro已经成为事实上的分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具。它支持数十种CPU指令集其中包括Intel x86,x64,MIPS,PowerPC,ARM,Z80,68000,c8051等等。

请添加图片描述

X64DBG

x64dbg 是 Windows 下的 32 64 位调试器,类似 ollydbg

请添加图片描述

OllyDbg

请添加图片描述

IDA的使用

想要入门逆向工程,那最正统的路径便是学习怎样使用IDA这个软件,并从这个过程中去学习反编译的技巧和各种逆向方法

提前准备了一个简单的C语言程序 reserve_codeblocks.exe,我们从它入手来学习IDA的使用

欸,先别着急,IDA有两个版本,ida和ida64我们要用哪个来打开这个程序呢?

请添加图片描述

请添加图片描述

想进一步熟悉IDA的使用,我们要从题目入手进一步分析

  1. BUUCTF : easyre(基础)

  2. BUUCTF : reverse_1(字符串中无flag)

  3. BUUCTF : xor (编写脚本)

    s = ['f',0xA,'k',0xC,'w','&','O','.','@',0x11,'x',0xD,'Z',';','U',0x11,'p',0x19,'F',0x1F,'v','"','M','#','D',0xE,'g',6,'h',0xF,'G','2','O']
    flag = 'f'
    for i in range(1,len(s)):
        if(isinstance(s[i],int)):
            s[i] = chr(s[i])
    for i in range(1,len(s)):
        flag += chr(ord(s[i]) ^ ord(s[i-1]))#a^b=c 等于 a^c=b
    
    print(flag)
    

常见的加密算法

base64加密

base64主要是将输入中的每3字节(共 24 bytes)按每 6 bytes分成一组,变成4个小于64的索引值,然后通过一个索引表得到4个可见字符。

char[] Base64Code =
            { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o','p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7','8', '9', '+', '/', '=' };

索引表为一个64字节的字符串,如果在代码中发现引用了这个索引表“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/” ,那么基本上就可以确定使用了base64,此外,有一些变种的base64,主要是改变了这个索引表。

TEA算法

TEA算法是一种常见的分组加密算法,密钥为 128 bytes位,明文为 64 bytes位,主要做了32轮变换,每轮变换都涉及移位和变换。TEA的源码为:

static void tea_encrypt(uint32_t *v, uint32_t *k) {
 uint32_t v0 = v[0], v1 = v[1], sum = 0, i;
 uint32_t delta = 0x9e3779b9;
 uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];
 
 for (i = 0; i < tea_round; i++) {
 sum += delta;
 v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
 v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
 }
 
 v[0] = v0;
 v[1] = v1;
}
 
static void tea_decrypt(uint32_t *v, uint32_t *k) {
 uint32_t v0 = v[0], v1 = v[1], sum, i;
 sum = (tea_round == 16) ? 0xE3779B90 : 0xC6EF3720;
 
 uint32_t delta = 0x9e3779b9;
 uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];
 for (i = 0; i < tea_round; i++) {
 v1 -= ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
 v0 -= ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
 sum -= delta;
 }
 
 v[0] = v0;
 v[1] = v1;
}

对TEA的识别也比较容易,在TEA算法中有一个固定的常数 0x9e3779b9 或者 0x61c88647,出现这两个特征值时可以以此确定TEA算法。

AES分组加密法

AES是常见的分组加密算法,其加解密流程如图。

AES加密过程涉及4种操作:字节替代(SubBytes),行移位(ShiftRows),列混淆(MixColumns)和轮密钥加(AddRoundKey)

其中,字节替代过程是通过S盒完成一个字节到另一个字节的映射,S盒和逆S盒具体如下:

请添加图片描述
请添加图片描述

如果发现程序中有S盒或者动态生成了S盒,则可以确定采用了AES加密。

RC4加密

RC4加密算法属于流加密算法,包括初始化函数和加解密函数,函数代码具体如下:

/* 初始化函数 */
void rc4_init(unsigned char*s,unsigned char*Data,unsigned long Len)
{
	int i=0,j=0;
    //char k[256]={0};
    unsigned char k[256]={0};
    unsigned char tmp=0;
    for(i=0;i<256;i++)
    {
        s[i]=i;
        k[i]=key[i%Len];
    }
    for(i=0;i<256;i++)
    {
        j=(j+s[i]+k[i])%256;
        tmp=s[i];
        s[i]=s[j];//交换s[i]和s[j]
        s[j]=tmp;
    }
}
/* 加解密 */
void rc4_crypt(unsigned char*s,unsigned char*Data,unsigned long Len)
{
    int i=0,j=0,t=0;
    unsigned long k=0;
    unsigned char tmp;
    for(k=0;k<Len;k++)
    {
        i=(i+1)%256;
        j=(j+s[i])%256;
        temp=s[i];
        s[i]=s[j];//交换s[i]和s[j]
        s[j]=tmp;
        t=(s[i]+s[j])%256;
        Data[k]^=s[t];
    }
}

可以看出,初始化代码对字符数组s进行了初始化赋值,且赋值分别递增,之后又对s进行了256次交换操作。通过识别初始化代码,可以判断为RC4算法。

MD5消息摘要算法

MD5消息摘要算法,是一种被广泛使用的密码散列函数,可以产生一个128位的散列值,用于确保消息传输的完整性和一致性。MD5加密的函数大致如下:

MD5_CTX md5c;
MD5Init(&md5c);
MD5UpdaterString(&md5c,plain);
MD5Final(digest,&md5c);

其中,MD5Init会初始化四个称作MD5链接变量的整型参数。因此如果看到这4个常数0x67452301,0xefcdab89,0x98badcfe,0x10325476,就可以怀疑该函数是否为MD5算法了。

MD5Init函数代码如下:

void MD5Init(MD5_CTX *context)
   /* context */
{
    context->count[0]=context->count[1]=0;
    /* Load magic initialization constants. */
    context->state[0] = 0x67452301;
    context->state[1] = 0xefcdab89;
    context->state[2] = 0x98badcfe;
    context->state[3] = 0x10325476;
}
  • 28
    点赞
  • 185
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值