逆向初识

逆向的定义与核心

  • 1.什么是逆向—–从目标代码反推源代码,从源代码理解开发者目的

    • ctf中与Cryto结合
      • Crackme(破解密码)
      • Keygenme(生成注册码)
    • 与隐写取证相结合
      • Recover(恢复文件)
    • 与PWN结合

      • Reverse(interface,struct,format,protocl)
      • Bypass auth ,Patch bin
    • 逆向的基本流程

      • 程序预处理,去混淆和过反调试
      • 代码逆向,找到验证函数
      • 验证函数逆向,找到验证算法
      • 破解验证算法,得到flag
  • 2.逆向的核心

    • 破解验证算法
    • 验证算法:
      1.简单比较算法
      2.密码算法验证
      3.算法求解验证
    • Key直接比较
    • Key简单变换
    • Key编码转换
    • Key散列计算
    • Key秘钥加密
    • Key算法求解
    • flag直接输出
    • 秘钥空间过短
    • 伪随机算法
  • 3.逆向的基础

    • 汇编,C语言
    • 操作系统原理与核心编程、程序加载
    • 反汇编与调试
    • 常用工具:
      • PE与ELF编辑、侦壳、脱壳工具(010editor、winhex、peid、upx、resource hacker、sysinternals)
      • 反汇编与反编译工具(IDA Pro、Hopper)
      • 调试器(Ollydbg、gdb、windbg)
    • 动态分析:调试、模拟
    • 静态分析:反汇编、反编译

    • 定位验证代码

      • 代码走查
        从程序主函数入口顺序追踪,适用于代码量小,主函数清晰的情况下
      • 字符串引用
        搜索目标字符串,反向查找引用的地址,适用于无混淆的大部分情况
      • API引用
        搜索API指针,反向查找引用的地址,适用于显式调用API的情况
      • API断点
        在API入口下断点,断下后反向查找引用地址,适用于有输出信息的大部分情况
      • 其他情况
        无明显输出信息:字符输入API处下断点
        从文件读入信息:文件读取API处下断点
    • 识别验证算法

      • 简单变换
        按位算术、逻辑运算,运算过程可逆
        运算过程代码量小,结构简单,常量简单(0,1)
      • 密码算法
        按块算数运算、逻辑运算,运算过程可逆
        运算过程代码量大,结构复杂,常量奇怪(0x9E3779B9)
      • 解题算法
        具体问题,具体分析
        迷宫问题,矩阵求解问题
      • 现实竞赛
        简单变换+密码算法+解题算法
        层层识别

进阶篇

  • 1.逆向的难点

    • 绕过软件保护(过保护层)
      • 编译器静态链接、优化
      • 加壳、加密、混淆、花指令
      • 反虚拟机、反调试、虚拟化
    • 理解各种目标(语言进阶)
      • 指令集:x86、x64、arm、arm64、mips…….
      • 操作系统:windows、linux、ios、android……
      • 语言:c、pascal、haskell、c++、Go……
      • 编译器:vc、gcc、lcc、llvm、易语言……
      • 库与框架:stl、mfc、qt、boost、易语言库……
      • 脚本:Java、c#、perl、php、python、ruby、lua……
      • 脚本编译打包:pyc、pyinstaller
    • 解决算法难题(算法进阶)
      • 密码算法变形
      • 矩阵求解
  • 2.如何进阶

    • 过保护层

      • .软件保护方法
        • 反编译:程序加壳,代码混淆
        • 反调试:调试检测
      • 代码加壳
        • 保护壳(压缩)
        • 加密壳(反调试)
        • 虚拟壳混淆(混淆)
      • 程序反调试
        • 检测调试状态(lsDebuggerPresent(),NtGlobalFlags())
        • 检测调试器(Process)
        • 检测断点(0xCC)
        • 检测跟踪(timecheck)
        • 检测补丁(crc)(网上搜索“反调试总结”)
      • 如何进阶
        • 熟悉操作系统调试相关
        • 熟悉常见的反调试措施
        • 识别,见招拆招
    • 语言进阶

      • 语言分类
        • 编译语言
        • 解释语言
      • 二进制文件
        • 去除变量名、函数名、类型默认保留(准确性)
      • 脚本文件
        • 变量名、函数名、类型默认保留(代码混淆)
        • 自己分析困难
      • 如何进阶
        • 识别,找工具(Google,GitHub,SourceForge)
        • 熟悉各种语言、运行和开发环境
        • 完整的正向过程,清晰的逆向思维
        • 经验(VC编译代码,IDA逆向之,OD调试之,MFC,Android,C#,py2exe)
    • 算法进阶

      • 复杂算法
        • 密码变种
        • 算法竞赛
      • 密码变种
        • 从简单识别到理解原理和实现
      • 算法竞赛
        • 了解常见的数据结构,抽象程序过程
      • 如何进阶
        • 算法入门竞赛
        • 找acmer帮忙
        • MATLAB
        • Python库(z3,NumPy)
  • 3.逆向其他题型

    • CTF逆向与隐写取证相关
      • 逆向恢复文件
    • CTF逆向与PWN相关
      • 逆向数据结构和接口
      • 逆向协议和文件格式
      • Patch bin
  • 4.逆向的地位及作用

    • CTF比赛人员配置
      • 初赛
      • 决赛
      • 人员配置
    • 主力逆向手
      • 专精保护层
      • 精通程序层
      • 精通算法层
    • 辅助逆向手
      • 精通算法层(PPC,Crypto)
      • 精通程序层(Pwn)
    • 逆向可攻可守

      • PWN
      • Patch
    • 经常遇到的问题

      • 坚实基础
        • 磨合
      • 部分基础
        • Hacker
        • Cracker
        • Acmer
        • Developer
      • 无基础
        • PHP语言
        • C语言
          应用密码学
    • 课程小结
      • 逆向的难点问题
        • 软件保护
        • 代码复杂
        • 算法难题
      • 如何克服这些难点
        • 脱壳
        • 精->通
        • ACM
      • 逆向其他类型的题目
        • 取证
        • PWN
        • Patch
-------------本文结束感谢您的阅读-------------
0%