网安
  • Develop
    • JAVA学习
      • 字节码
      • API开发
      • Web开发
      • 工程结构推荐
      • 创建第一个项目
      • 权限管控
      • 配置文件
      • 日志管理
      • 数据访问
      • 性能监控
      • IoC容器
      • Spring
      • Filter与Listener
      • jsp
      • MVC
      • servlet-1
      • servlet-2
      • servlet-3
      • servlet-4
      • FreeMarker
      • Thymeleaf
      • EL
      • SpEL
      • JSTL
      • 部署
      • JDBC
      • 数据库连接池
      • fastjson
      • jackson
      • XML
      • JSON
      • 序列化
      • Maven
      • 安装与使用
      • 工具
      • 爬虫
    • GO学习
      • GO
        • flag 包
        • goland 远程调试
        • GoReleaser
        • OS 包
        • time 包
        • 格式化输出
    • Lua学习
      • Lua
      • 基础语法
      • LuaJIT
      • 与系统交互
    • Pyhon
      • 基础
      • Django
      • CLI
      • miniforge
      • MockingBird
      • pdb
      • pyc
      • 装的我脑血栓要犯了
      • Python101
      • 反序列化
      • 爬虫
      • Pillow
      • 图像识别
      • flask
    • Speed-Ruby
      • 入门1
      • 入门2 对象
      • 入门3 创建命令
      • Encoding类
      • File类与Dir类
      • IO
      • Proc类
      • Time类与Date类
      • 正则
      • 错误处理与异常
      • 对象、变量和常量
      • 方法
      • 数值
      • 数组
      • 条件判断
      • 循环
      • 运算符
      • Socket编程
      • 字符串
      • 并发与线程
      • 块
      • 类和模块
      • 散列
    • Web
      • HTTP
        • Connection
        • HTTP 报文
        • Vary
      • 笔记
        • 跳转
        • 认证 & 授权
        • 同源策略(SOP)
        • 文件
    • Git 学习笔记
    • JSON
      • JSON 学习笔记
    • HTML
      • Speed-HTML
      • 语法学习
      • HTML字符实体
    • XML
      • XML 学习笔记
    • 计算机基础
      • 操作系统
      • 计算机组成
      • 算法
      • 内存
      • 字符编码
    • gnuplot 学习笔记
    • regex
  • Integrated
    • Linux
      • God-Linux
      • Secure-Linux
      • Power-Linux
      • IO模型
      • Speed-Linux
      • 发行版
      • 工具
      • 启动过程
      • 进程
      • 认证
      • 日志
      • 守护进程
      • 文件
      • 信息
      • VSFTP 配置案例
      • auditd
      • containerd
      • DNS 配置案例
      • Docker
      • Docker-Compose
      • firewalld 实验
      • gpg
      • Iptables
      • httpd
      • LAMP
      • mysql
      • nfs 配置案例
      • openssl
      • PAM
      • samba 配置案例
      • terraform
      • ufw
      • VSFTP 配置案例
    • Network
      • Speed-Net
      • Power-Net
      • SDN 笔记
      • DNS
      • TLS
    • Windows
      • Secure-Win
      • Speed-Win
      • ACL
      • LDAP
      • IPC$(Internet Process Connection)
      • PDB符号文件
      • 工作组
      • WinRM
      • 角色权限
      • 凭据
      • 签名
      • 日志
      • 认证
      • 协议
      • 信息
      • 应用
      • 组策略
      • 域
      • asp站点搭建
      • Exchange 搭建
      • Windows 故障转移集群
      • Windows 基础服务搭建
      • Windows 域搭建
      • 本地抓包
      • PowerShell 笔记
    • 容器
      • Docker
    • 数据库
      • Speed-SQL
      • Power-SQL
      • MSSQL
      • MySQL
      • Postgresql
      • Redis
      • MySQL大小写问题
      • 主键和外键
      • MySQL快速入门
      • 虚拟化
        • ESXi
        • vCenter
  • Plan
    • Mac-Plan
    • Misc-Plan
    • Team-Plan
    • Thinking-Plan
    • VM-Plan
  • Sercurity
    • Power-PenTest
    • BlueTeam
      • 安全建设
      • 分析
      • 加固
      • 取证
      • 应急
      • USB取证
      • 磁盘取证
      • 内存取证
      • ClamAV 部署
      • yara 实验
      • 安防设施搭建使用
      • ZIP明文攻击
      • 流量分析
    • Crypto
      • Crypto
        • 2020 9 G60攻防大赛
        • CTF
        • 2020 9 中能融合杯工控CTF
        • 2020 10 全国工业互联网安全技术技能大赛江苏省选拔赛
        • 2020 10 全国网络与信息安全管理职业技能大赛江苏场
        • 2020 11 I²S峰会暨工业互联网安全大赛
        • 2021 6 第二届I²S峰会暨工业互联网安全大赛
        • 2021-9-第七届工控信息安全攻防竞赛
        • 2021 9 第七届全国职工职业技能大赛某市县选拔赛
        • 2021 9 全国网络与信息安全管理职业技能大赛江苏场
        • 2021-10-G60攻防大赛
    • CTF
      • CTF
      • writeup
        • 2020 9 中能融合杯工控CTF
        • 2020 9 G60攻防大赛
        • 2020 10 全国工业互联网安全技术技能大赛江苏省选拔赛
        • 2020 10 全国网络与信息安全管理职业技能大赛江苏场
        • 2020 11 I²S峰会暨工业互联网安全大赛
        • 2021 6 第二届I²S峰会暨工业互联网安全大赛
        • 2021-9-第七届工控信息安全攻防竞赛
        • 2021 9 第七届全国职工职业技能大赛某市县选拔赛
        • 2021 9 全国网络与信息安全管理职业技能大赛江苏场
        • 2021-10-G60攻防大赛
    • ICS
      • PLC攻击
      • S7comm 相关
      • 工控协议
      • 上位机安全
      • Modbus 仿真环境搭建
      • siemens 仿真搭建实验
      • S7-300 启停实验
    • IOT
      • 无线电安全
        • RFID复制卡
        • RFID基础知识
        • WiFikiller
      • 硬件安全
        • DIY键盘嵌入指纹识别模块实验记录
        • Device-Exploits
        • HID-Digispark
        • HID-KeyboardLogger
        • HID-USBHarpoon
        • HID-USBKeyLogger
      • 固件安全
        • 固件安全
        • Dlink_DWR-932B 路由器固件分析
    • Mobile sec
      • 小程序安全
      • Android安全
    • PWN
      • SLMail溢出案例
      • PWN
    • Red Team
      • OS安全
        • Linux 安全
        • Exploits
        • NTLM中继
        • Windows 安全
        • Responder欺骗
        • Windows-LOL
      • Web_Generic
        • Top 10
          • RCE
          • Fileread
          • SQLi
          • SSRF
          • SSTI
          • Web Generic
          • XSS
          • XXE
      • Web_Tricks
        • JWT 安全
        • HTTP_request_smuggling
        • OOB
        • 绕过访问
      • 靶场
        • Hello-Java-Sec 学习
        • DVWA-WalkThrough
        • pikachu-WalkThrough
        • upload-labs-WalkThrough
        • XVWA-WalkThrough
        • XSS挑战-WalkThrough
      • 实验
        • flask
        • fastjson
        • Log4j
        • nodejs
        • Shiro
        • Spring
        • Weblogic
      • 前端攻防
      • IDOR
    • 安防设备
      • Exploits
      • Bypass 技巧
    • 后渗透
      • 权限提升
      • 后渗透
      • 权限维持
      • 实验
        • C2 实验
        • Exchange
        • 端口转发实验
        • 代理实验
        • 免杀实验
        • 隧道实验
    • 软件服务安全
      • Exploits
      • CS Exploits
      • 实验
        • Docker
        • Kubernetes
        • Mysql
        • Oracle
        • PostgreSQL
        • Redis
        • vCenter
    • 协议安全
      • Exploits
    • 信息收集
      • 端口安全
      • 空间测绘
      • 信息收集
    • 语言安全
      • 语言安全
        • 语言安全
      • GO安全
        • GO安全
        • Go代码审计
      • JAVA安全
        • JAVA安全
        • JAVA代码审计
        • JAVA反序列化
        • SpEL 注入
      • PHP安全
        • PHP安全
        • bypass_disable_function
        • bypass_open_basedir
        • phpinfo
        • PHP代码审计
        • PHP反序列化
        • PHP回调函数
        • 变量覆盖
        • POP
        • 弱类型
        • 伪协议
        • 无字母数字Webshell
      • Python安全
        • pyc反编译
        • Python安全
        • Python 代码审计
        • 沙箱逃逸
      • dotnet安全
      • JS安全
    • 云安全
      • 公有云安全
    • Reverse
      • Reverse
      • FILE
        • ELF
        • BMP
        • JPG
        • PE
        • PNG
        • ZIP
        • 文件头
      • 实验
        • PYAble
          • 2-逆运算
          • 1-基本分析
          • 3-异或
          • 4-Base64
          • 5-Base64换表
          • 6-动态调试
        • Windows
          • condrv.sys 内存损坏漏洞
    • 工具
      • Aircrack
      • BloodHound
      • Burp Suite
      • frp
      • CobaltStrike
      • Ghidra
      • fscan
      • Hashcat
      • IDA
      • merlin
      • Kali
      • Metasploit
      • Mimikatz
      • ModSecurity
      • Nmap
      • nps
      • nuclei
      • pupy
      • RedGuard
      • SET
      • sliver
      • Snort
      • Sqlmap
      • Suricata
      • Sysmon
      • uncover
      • Volatility
      • Wfuzz
      • Wireshark
      • xray
    • 安全资源
      • 靶机
        • VulnHub
          • DC
            • DC2 WalkThrough
            • DC1 WalkThrough
            • DC3 WalkThrough
            • DC4 WalkThrough
            • DC5 WalkThrough
            • DC6 WalkThrough
            • DC9 WalkThrough
            • DC8 WalkThrough
          • It's_October
            • It’s_October1 WalkThrough
          • Kioptrix
            • Kioptrix2 WalkThrough
            • Kioptrix3 WalkThrough
            • Kioptrix4 WalkThrough
            • Kioptrix5 WalkThrough
          • Mission-Pumpkin
            • PumpkinGarden-WalkThrough
            • PumpkinFestival WalkThrough
            • PumpkinRaising WalkThrough
          • Symfonos
            • symfonos1 WalkThrough
            • symfonos2 WalkThrough
            • symfonos3 WalkThrough
            • symfonos5 WalkThrough
        • Wargames
          • Bandit
            • Bandit-WalkThrough
      • 面试问题
        • 面试问题
Powered by GitBook
On this page
  • 免责声明
  • 简介
  • 环境配置
  • 基础介绍
  • Listing
  • Program Tree
  • Symbol Tree
  • Data Type Manager
  • Decompile
  • Console
  • CTF实例
  1. Sercurity
  2. 工具

Ghidra

PreviousCobaltStrikeNextfscan

文章作者


免责声明

本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关.


简介

Ghidra 是由美国国家安全局(NSA)研究部门开发的软件逆向工程(SRE)套件,用于支持网络安全任务。包括一套功能齐全的高端软件分析工具,使用户能够在各种平台 (Windows、Mac OS 和 Linux) 分析编译后的代码。功能包括反汇编,汇编,反编译,绘图和脚本,以及数百个其他功能。和 IDA 一样,Ghidra 支持各种处理器指令集和可执行格式,用户还可以使用公开的 API 开发自己的 Ghidra 插件和脚本。不同的是,IDA 是收费的,而 Ghidra 是免费开源的。


环境配置

Ghidra 的压缩包可以在 上下载到,截至目前最新版本为 9.2,官方推荐使用的 JDK 版本为 11+。配置好 JAVA 环境后,解压压缩包即可。如电脑上有多个 JAVA 环境,可以在 Ghidra 文件夹下的 support/launch.properties 文件中修改 JAVA_HOME_OVERRIDE 的值。

在 Windows 上运行 ghidraRun.bat,在 Linux/unix/macOS(OS X) 上运行 ghidraRun 启动。Ghidra 操作指南位于解压文件夹下的 docs/CheatSheet.html。

Ghidra 启动示意图:


基础介绍

IDA 只要把要分析的文件拖进去即可,而 Ghidra 则不同,Ghidra 是基于项目 (Project) 设计的,个人感觉这一点应该是为了方便团队协作而设计的。要开始使用 Ghidra 需先创建一个项目,点击 File->New Project->Non-Shared Project->next->选择项目文件夹并填写项目名称 ->Finish。

如图,我创建了一个名为 test 的项目

这个时候,就可以把要分析的文件拖进去了,也可以通过File->Import File->导入想要分析的文件,点击OK即可。

Ghidra 在加载完成后,会显示该文件的基础信息,如架构、大小、MD5值等

然后就可以用 Ghidra 自带的 CodeBrowser 打开目标文件了,在目标文件名上右击 ->Open with -> CodeBrowser

一般第一次打开某个文件,Ghidra 都会提醒我们是否要分析,选择 yes,然后会出现分析选项,我们这里不做任何更改,直接 Analyze 即可

然后,Ghidra 会花较长的时间分析,受你的 CPU 性能以及分析文件的大小影响。由于 Ghidra 是 JAVA 编写的,在效率上会低于 C/C++ 编写的 IDA。

接下来,我将依次对下方各个窗口进行简单的介绍。

Listing

也就是中间那块最大的窗口,我们一般把这样的窗口叫做反汇编窗口,主要用来展示地址、opcode、汇编语句等。通过鼠标滚轮或者右边的滑动条来控制上下移动。

右侧的各种颜色的点标志各个段所在地址,比如 CODE、DATA、idata 等,点击即可跳转到相应的段

将鼠标移动到函数名或者偏移地址上会显示出详细信息

可以使用快捷键 G,来跳转到想要去的地址

Program Tree

这个位于左上角的窗口,主要显示了程序头部以及各个段。我们可以在相应的文件夹上右击 ->Create Folder/Create Fragment,来创建文件夹或者分段。这个功能在用来分析大型项目的时候,效果比较显著。同样的,在文件夹上右击还能够进行排序 (Sort) 功能,提供了 by Address、by Name 两种功能可供选择。

我们可以通过选中 Listing 窗口中的代码块拖动到该窗口中来创建分段。也可以在不想要的时候,将相应的分段或者文件夹删除。需要注意的是,只有当删除的分段 / 文件夹包含于其他分段 / 文件夹中或者删除的分段 / 文件夹为空时,才能成功删除。

Symbol Tree

符号树窗口位于左侧的中间位置,主要显示导入表 (Imports)、导出表(Exports)、函数(Function)、标签(Labels)、类(Classes) 以及命名空间(Namespaces)。

可以在 Imports 文件夹上右击 ->Create Library 来创建库。在想要的关联的 Imports 文件夹中的库上右键 ->Set External Program->选择想关联的外部程序来设置相应的外部关联程序。在一个父类 / 命名空间上右击 ->Create Class/Namespaces,可以创建类 / 命名空间。所有在 Namespace 中的命名空间,都在全局命名空间中。

Data Type Manager

数据类型管理器窗口位于左下角,用来展示各种数据类型。可以让用户定位、组织数据类型,也能够将数据类型应用于程序。Ghidra 的一个长期目标,就是让用户能够搭建数据类型的库,并在不同的程序、项目甚至用户之间分享使用。

Ghidra 支持三类数据类型: Built-in、user defined、derived

类型
描述

Built-in

直接由 Java 实现并被用于基本的标准类型,比如 byte、word、string 等等,不能被改变或重命名

user defined

有四个用户定义 (user defined) 的数据类型,分别是 Structures、Unions、Enums 和 Typedefs,可以被创建、修改及重命名

derived

两种派生的数据类型: Pointers(指针)和 Arrays(数组),可以被创建与删除,但是名字由其基本类型决定

以当前这个测试项目为例,Ghidra 在分析完后,会自动生成 BuiltInTypes 列表,同时还会根据程序的架构等生成相应的数据类型列表。比如这里是 windows_vs12_32

Decompile

反编译窗口,位于右侧。在Listing窗口中浏览到函数时,反编译窗口会显示将其反编译成C/C++语言后的结果,功能上类似于IDA的F5。

可以通过右上角的导出按钮,把相应的函数导出成C文件。

Console

控制台窗口,位于最下方,用来显示各种脚本的输出等。脚本管理器位于 Window->Script Manager ,里面有很多 Ghidra 自带的脚本。

其中大多数为 .java 的脚本,还有部分为 .py 的脚本。选择一个脚本,点击运行,Ghidra 便会加载该脚本,并将输出显示在控制台窗口中(如果有的话)。

下面结合一个具体实例,来演示下 Ghidra 的使用。


CTF实例

熟悉文件头的人都知道,PK..是压缩包的文件头,如果不熟悉的话,也可以用 binwalk 分离出来。

binwalk -Me RE_Cirno.jpg

解压,得到 re.exe。在命令行中运行re.exe,得到如下提示。

把 re.exe 拖到 Ghidra 中打开,进行分析。由于有按任意键继续,猜测使用了system("pause")函数。在上方的Search->For Strings->中查找pause

通过点击右边的交叉引用,找到关键函数

Windows->Function Graph 可以看到该函数地图形化显示

在右侧的反编译窗口,将关键的代码段拷贝下来

  uint local_70;
  uint local_6c;
  int local_68;
  int local_64 [24];
  local_64[0] = 0x73;
  local_64[1] = 0x5e;
  local_64[2] = 0x61;
  local_64[3] = 0x72;
  local_64[4] = 0x67;
  local_64[5] = 0x2f;
  local_64[6] = 0x6b;
  local_64[7] = 0x72;
  local_64[8] = 0x41;
  local_64[9] = 0x30;
  local_64[10] = 0x31;
  local_64[11] = 0x69;
  local_64[12] = 0x75;
  local_64[13] = 0x76;
  local_64[14] = 0x65;
  local_64[15] = 0x30;
  local_64[16] = 0x71;
  local_64[17] = 0x5f;
  local_64[18] = 99;
  local_64[19] = 0x2f;
  local_64[20] = 0x5c;
  local_64[21] = 0x74;
  local_64[22] = 0x5d;
  local_64[23] = 0x66;
  local_68 = 0;
  while (local_68 < 0x18) {
    local_70 = local_64[local_68] + 9U ^ 9;
    local_68 = local_68 + 1;
    local_6c = local_70;
  }

只需简单修改下,即可编译运行。

得到字符串

uncry1}rC03{wvg0sae1ltof

根据上面的提示反方向围住,将该字符串颠倒下

fotl1eas0gvw{30Cr}1yrcnu

然后解栅栏密码,得到 flag

之所以拿这道题目举例,是因为同样的程序在 ida 7.0 的 反编译如下:

可以注意到是没有异或符号的,而在反汇编中,我们可以清楚地看到存在异或操作。暂不清楚,新版本 IDA 是否修复该 bug。

我这里选择的是的逆向题的题目。这个题目的附件是个 .jpg文件,使用010打开该文件,会发现下方有个未知填充块。

BugKuCTF平台
RE_Cirno
the-fog
官网