美文网首页
reverse简介

reverse简介

作者: theLexical | 来源:发表于2021-02-19 18:08 被阅读0次

    软件代码逆向主要是对软件的结构、流程、算法、代码等进行逆向拆解和分析。

    有我objdump反汇编不了的机器码吗?

    有我IDA F5逆向不了的代码吗?

    应用领域

    主要用于软件维护、软件破解、漏洞挖掘、恶意代码分析。

    CTF中的逆向:

    • 熟悉OS、汇编、加解密等相关知识
    • 具有丰富的多种高级语言的编程经验
    • 熟悉多种编译器的编译原理
    • 较强的程序理解和逆向分析能力

    常规逆向流程:

    1. 使用strings/file/binwalk/IDA等静态分析工具收集信息,并根据这些静态信息进行google/github搜索

      怎么收集?收集哪些?

    2. 研究程序的保护方法,如代码混淆、保护壳及反调试等技术,并设法破除或绕过保护

    3. 反汇编目标软件,快速定位到关键代码进行分析。

      怎么定位到关键代码?什么是关键代码?

    4. 结合动态调试,验证自己的初期猜想,在分析过程中理清程序功能

      动态调试是什么?gdb调试吗?我要根据什么有猜想?

    5. 针对程序功能,写出对应脚本,求解出flag

    定位关键代码tips

    1. 分析控制流

      控制流可以参见IDA生成的控制流程图(CFG),沿着分支循环和函数调用,快速得到阅读汇编代码进行分析。

    2. 利用数据、代码交叉引用

      比如输出的提示字符串,可通过数据交叉引用找到对应的调用位置,进而找出关键代码。

      数据交叉引用是什么?

      代码交叉引用,比如GUI程序获取用户输入,就可以使用对应的多WindowsAPI函数,我们就可以通过这些API函数调用位置找到关键代码。

      是说通过获取输入的api函数,看周围的代码吗?

    逆向tips

    1. 编码风格

      每个程序员的编码style不同,熟悉设计模式的话能更快速的分析出函数模块功能。

    2. 集中原则

      开发写程序时,往往习惯将功能相关的代码或数据放在同一个地方,反汇编后的代码也能看出来,因此分析时可以查看关键代码附近的函数和数据。

    3. 代码复用

      复用情况很普遍,Github时主要来源,分析时可以找一些特征在github搜索,可能会发现类似代码,并据此恢复处分析时缺失的符号信息等。

    4. 七分逆向三分猜

    5. 区分代码;耐心

    动态分析

    动态分析的目的在于定位关键代码后,程序运行的过程中,借由输出信息(寄存器、内存变化、程序输出)等来验证自己的推断或理解程序功能。

    主要方法有:调试、符号执行、污点分析

    符号执行是什么?

    算法和数据结构识别

    • 常用算法识别

      Tea/XTea/XXTea/IDEA/RC4/RC5/RC6/AES/DES/MDD5/SHA256/SHA1等加解密算法、大数加减乘除、最短路径等传统算法。

    • 常用数据结构识别

      如图、树、hash表等高级数据结构在汇编代码中的识别。

    代码混淆

    比如使用OLLVMmovfuscator花指令虚拟化SMC等工具技术对代码进行混淆,使得程序分析十分困难。

    怎么混淆?怎么分析起来就困难了?多加没用的代码吗?

    也有对应的反混淆技术,最主要目的就是复原控制流,比如模拟执行符号执行

    保护壳

    保护壳类型有很多种,简单的压缩壳可以归类为如下几种:

    • unpack -> execute

      直接将程序代码全部解压到内存中再继续执行程序代码。

    • Unpack -> execute -> unpack -> execute -> ...

      解压部分代码,边解压边执行

    • Unpack -> [decoder | encoded code] -> decode -> execute

      程序代码有过编码,解压后再解码再执行

    对于脱壳也有相关的方法,比如单步调试法ESP定律等。

    反调试

    反调试,通过检测调试器等方法,避免程序被调试分析。比如使用一些API函数如IsDebuggerPresent检测调试器,使用SHE异常处理,时间差检测等方法。也可通过覆写调试端口、自调试等方法进行保护。

    那我把这些代码删掉不就行了?

    非常规逆向思路

    可以是任意架构的任意格式文件。

    • lua/python/java/lua-jit/haskell/applescript/js/solidity/webassembly/etc..
    • firmware/raw bin/etc..
    • chip8/avr/clemency/risc-v/etc.

    但是逆向工程的方法学里不惧怕这些未知的平台格式,遇到这样的非常规题,我们也有一些基本的流程可以通用

    前期准备

    • 阅读文档:阅读官方文档
    • 官方工具:官方提供的工具必然很有用
    • 教程:在逆向方面,也许有许多前辈写出了专门针对该平台语言的逆向教程,因此也可以快速吸收这其中的知识。

    找工具

    主要找文件解析工具反汇编器调试器反编译器。其中,反汇编器是必须的,调试器也包含有相关的反汇编功能。

    找工具总结起来就是:Google 大法好。合理利用 Google 搜索语法,进行关键字搜索可以帮助你更快更好地找到合适工具。

    Reference

    相关文章

      网友评论

          本文标题:reverse简介

          本文链接:https://www.haomeiwen.com/subject/cfoaxltx.html