写在前面

  此系列是本人一个字一个字码出来的,包括示例和实验截图。本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正。 如有好的建议,欢迎反馈。码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作。如想转载,请把我的转载信息附在文章后面,并声明我的个人信息和本人博客地址即可,但必须事先通知我

你如果是从中间插过来看的,请仔细阅读 跟羽夏学 Ghidra ——简述 ,方便学习本教程。请认准 博客园寂静的羽夏 ,目前仅在该平台发布。

前言

  导航浏览是逆向者的基本能力,在源码完全未知的情况下,该能力是十分重要的。在介绍完如何导航分析二进制之后,我们会以逆向的角度,来审视crakeMe这个函数。

来回横跳

  在我们在不同的函数之间进行切换的时候,有时候错过想回去看看的时候,再重新点回去一是麻烦,二是不准,那么咋办呢?

  图中,高亮的两个按钮就是负责这个事情的。向左的箭头是回到上一次的位置Alt + 左方向键,向右的反之Alt + 右方向键。这两个功能会在之后经常用到。

搜索

  搜索和搜集信息的能力是在逆向中最常用也是最重要的能力之一。

  在程序中,我们可以搜索字符串,定位函数位置:

  里面有很多选项,英文不会的话翻译一下,然后记住,因为专业常用的单词就几个,会了就会了。

  其次,我们还可以搜内存的数据,来进行定位:

  当然,这些功能应该不会特别常用,不过在特殊的场合还是有用的,比如通过特征码搜索指定函数、字符串等等。这所有的功能全部在Search菜单当中。

搜集信息

  在逆向过程中,搜集信息也是十分重要的,比如字符串。

  在Search菜单中选中For Strings...,将会弹出窗体:

  这个是设置搜索属性的,如果有特殊的自行设置,如果没有,直接默认搜索,在本示例会得到如下内容:

  Ghidra也能搜索常量,在Search菜单中选中For Scalars...

  选好常量范围后,然后点击搜索,会得到如下结果:

  不过,搜索常量似乎用处不大。

  对于某个位置的引用,我想获得分析得到的所有直接引用,并选择跳转到哪一个,在Search菜单中选中For Direct Reference...

  不过查引用的时候一般不会用这个,我们更偏爱使用这种方式查找:

  我们既可以获取该地址的引用,如果是函数地址,也能获取到函数的引用。

  Ghidra与此同时也支持指令模式搜索,在Search菜单中选中For Instruction Patterns...

  不过,要使用这个,首先需要要点击编辑按钮(笔的图标),输入硬编码之后确认,然后点击搜索即可:

其他

  不知道你有没有注意到工具栏上几个小小的字母图标:

  这几个图标有自己的作用,不过通过工具英文提示也明白啥作用,这里就总结一下(从左到右依次):

  • 设置方向:通过该按钮可以更改跳转的方向,这个仅对图上的按钮有效,方向指示和图标一致。
  • 下一条指令:跳转到下一条指令。通过实验得知,它会跳转到匹配到非上一条为指令的指令。The Ghidra Book并没有解释清楚。
  • 下一条数据:跳转到下一条数据。
  • 下一个未定义:跳转到下一个未定义类型的数据。
  • 下一个标签:跳转到下一个标签。
  • 下一个函数:跳转到下一个函数。
  • 下一个非函数指令:跳转到下一个不属于函数内部的指令。
  • 下一个不同字节值:跳转到下一个不同的字节的值。
  • 下一个书签:跳转到下一个书签。

实验

  学习了这些,我们开始从逆向者的角度,来开始分析。

  在开始破解实验的时候,我们看到显示了一个字符串请输入密钥:,这个是我们的一个关键突破口,如果能找到,会有一定的概率破解(不排除有假的)。

  然后,我们开始菜单Search-For Strings...,开始搜索,最终我们定位到位置:

  跳转到这个位置:

                      s__004021ff                           XREF[2]:  getKey:004014b4(*),
getKey:004014b4(*)
004021ff e8 af ds u8"请输入密钥:"
b7 e8
be 93
//
// .eh_frame_hdr
// SHT_PROGBITS [0x402214 - 0x40228f]
// ram:00402214-ram:0040228f
//
************************************************
* Exception Handler Frame Header *
************************************************
__GNU_EH_FRAME_HDR XREF[2]: 00400210(*),
_elfSectionHeaders::00000
00402214 01 1b eh_fra Exception Handler Frame H
03 3b

  我们看到这里有交叉引用,是从getKey函数来的,跟过去:

int getKey(void)
{
int local_c; puts("请输入密钥:");
__isoc99_scanf("%d",&local_c);
return local_c;
}

  根据反编译结果,理解了该函数的功能,我们需要分析一下该函数的引用:

  通过简单的分析,我们推测CALL getKey这个地址最有嫌疑,我们跟过去:

bool crackMe(void)
{
int iVar1; iVar1 = getKey();
return iVar1 == 0x123456;
}

  可以看出,拿到返回值之后,会判断是否和0x123456相等,并将比较结果返回。

  我们如法炮制,最终跟到了这个位置(局部):

iVar1 = crackMe();
if (iVar1 == 0) {
puts("抱歉,没成功哦,再试一次!");
}
else {
puts(">> 祝贺破解成功!");
}

  此时,我们明白了结果。只要输入的值与0x123456相等就通过,由于是十进制输入,就是1193046。输进去就是下面的结果:

  至此,该实验结束。

小结

  本篇博文我们介绍了如何导航并搜集自己所需要的信息。不过逆向并没有这么简单,该示例并不难,且有源码,有前面教程分析的基础上,看起来相当简单,不信?你直接搜字符串都不一定搜得到。

下一篇

  跟羽夏学 Ghidra ——调试

跟羽夏学 Ghidra ——导航的更多相关文章

  1. 跟羽夏学 Ghidra ——引用

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  2. 跟羽夏学 Ghidra ——窗口

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  3. 跟羽夏学 Ghidra ——工具

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  4. 跟羽夏学 Ghidra ——初识

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  5. 跟羽夏学 Ghidra ——数据

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  6. 跟羽夏学 Ghidra ——调试

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  7. (二)羽夏看C语言——容器

    写在前面   由于此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇 ...

  8. 羽夏看Win系统内核——保护模式篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  9. 羽夏看Win系统内核——系统调用篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

随机推荐

  1. mariadb安装配置(主从配置)

    主服务器192.168.206.183 从服务器192.168.206.193 1.创建并编辑 /etc/yum.repos.d/MariaDB.repo文件(主从都要做) [mariadb] nam ...

  2. 利用websocket实现手机扫码登陆后,同步登陆信息到web端页面

    新手必看 广播系统 事件系统 准备工作 初始化项目 引入 laravel-websockets 软件包 启动 websocket 监听 主要流程 创建两个页面 建立 socket 连接 手机端扫码登陆 ...

  3. RocketMQ 集群的搭建部署 以及rocketmq-console-ng仪表台的安装部署

    在 RocketMQ 主要的组件如下. NameServerNameServer 集群,Topic 的路由注册中心,为客户端根据 Topic 提供路由服务,从而引导客户端向 Broker 发送消息.N ...

  4. .NET Core 实现后台任务(定时任务)IHostedService(一)

    原文链接:https://www.cnblogs.com/ysmc/p/16456787.html 最近有小伙伴问道,在 .Net Core 中,如何定时执行任务,而因为需要执行的任务比较简单,并不想 ...

  5. 配置SSM公钥及创建远程仓库和在IEDA中集成git操作

    3.将.ssh下的id_rsa.pub公钥copy到gitee工作台中 4.创建个人仓库 5.设置开源许可证:开源是否可以随意转载,开源但是不能商业使用,不能转载,- 限制! 6.克隆到本地! IDE ...

  6. PySide6/PyQt开发xml编辑器(1)

    QTreeWidget折叠子项(折叠当前项的所有子项) 本文仅供本人知识总结使用,所以内容会比较浅显,不喜勿喷. 目录 QTreeWidget折叠子项(折叠当前项的所有子项) 目录 一.仅折叠子项 二 ...

  7. NOI / 2.5基本算法之搜索-6044:鸣人和佐助详解

    总时间限制: 1000ms 内存限制: 65536kB 题目 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到, ...

  8. 第八天pyhton3 函数的返回值、作用域

    返回值 pthon函数使用return语句返回"返回值": 所有函数都有返回值,如果没有return语句,隐式调用return None: return 语句并不一定是函数的语句块 ...

  9. ViewPlane类定义

    这个类主要是记录了所有跟视图窗口有关的数据,用于显示. 类声明: #pragma once #ifndef __VIEWPLANE_HEADER__ #define __VIEWPLANE_HEADE ...

  10. 杭州思科对 Apache DolphinScheduler Alert 模块的改造

    杭州思科已经将 Apache DolphinScheduler 引入公司自建的大数据平台.目前,杭州思科大数据工程师 李庆旺 负责 Alert 模块的改造已基本完成,以更完善的 Alert 模块适应实 ...