CTF-REVERSE练习之逆向初探

news2024/11/24 15:03:36

逆向是指通过反汇编和调试等一些手段及工具,分析计算机程序的二进制可执行代码,从而获得程序的算法细节和实现原理的技术。不仅如此,逆向技能在信息安全面向的具体工作,如恶意代码分析、软件漏洞挖掘、移动安全以及对软件的破解方面发挥着巨大的作用。

前面介绍过CTF的web真题,那今天我们从CTF中选择一个REVERSE题型来讲解。

先介绍一下,REVERSE是CTF竞赛中的一种常见题目类型,主要考察参赛选手逆向工程相关的知识,考查形式为通过对一个二进制程序(exe、dll或者是elf等)进行逆向分析,了解程序内部的实现机制,最终目的可能是得到一个密码,或者是编写一个注册机用于计算指定用户名对应的注册码等。

那我们要怎么才能对一个程序进行逆向,一个完整的程序怎么看到它的代码呢?

当然别人也想到过这种问题,所以就出现了几种帮助逆向的工具。

1.PEiD是一款著名的查壳工具,其功能十分强大,几乎可以侦测出绝大部分的壳以及程序编译信息。PEiD支持各种外部插件,同时支持用户自定义的加壳程序签名信息。

2.Ollydbg简称OD,是一款具有图形用户界面的用户模式调试器,可以运行于各种主流Windows操作系统下。Ollydbg具有动态调试和静态分析功能,非常容易上手,对异常的跟踪处理相当灵活,并且许多爱好者为这款调试器编写了许多非常棒的插件,这些特性使得其成为Windows操作系统上用户模式下动态调试器的首选。Ollydbg的反汇编引擎十分强大,可以识别数千个被C和Windows频繁使用的函数,并可以自动对参数进行注释。底下是OD一些常用的快捷键。

F2 设置一个断点(如果断点已经存在,那么断点将被删除)

F4 运行到光标所在行(运行到光标所在行时自动断下)

F7 单步跟踪(如果遇到一个call,则跟踪进入)

F8 单步跟踪(如果遇到一个call,则执行完整个call)

F9 继续执行(运行程序,直到进程退出或遇到下一个断点)

3.IDA是一款交互式反汇编工具,其功能十分强大,支持多操作系统、多处理器下的二进制程序的反汇编分析,并且可以和使用者进行交互来提升处理效率。IDA支持插件,支持IDC脚本,Hex-
Rays
Decompiler是IDA一个十分强大的插件,支持将反汇编代码直接转换为C语言伪代码,极大的提高了反汇编分析人员的工作效率。这底下是ida的快捷键可以帮助我们更加高效的进行分析。

空格 在图形模式和列表视图模式之间切换反汇编视图

F5 将反汇编指令还原为伪代码

x 查看交叉引用

n 对变量名或者函数名进行重命名操作

d 将二进制数据解释为字节/双字/四字

c 将二进制数据解释为代码

a 将二进制数据解释为字符串

实验步骤

好我们来开始实验,先进入实验网页:[CTF-
REVERSE练习之逆向初探](https://www.hetianlab.com/expc.do?ec=ECID172.19.104.182014111410002900001&pk_campaign=freebuf-
wemedia)。

题目描述:

主机C:\Reverse\1目录下有一个CrackMe1.exe程序,运行这个程序的时候会提示输入一个密码,当输入正确的密码时,会弹出过关提示消息框,请对CrackMe1.exe程序进行逆向分析和调试,找到正确的过关密码。

我们开始第一步进行外部行为分析不管在什么场景下,相信你在刚接触一个新事物的时候,都会仔细观察事物的外部特征,CTF做题也是一样的,在拿到题目之后可以运行程序,观察程序都有哪些地方可以输入数据,哪些按钮点击了会有什么样的反应,在操作过程中出现了哪些提示等。

我们通过对CrackMe1.exe程序的观察,知道程序需要输入一个密码,当不输入任何数据就点击按钮时,提示如下信息:

图片1.png

当输入一串测试数据时,提示如下信息:

图片2.png

这里有弹框还有提示,我们是不是直接去查找这个提示就可以了呢。但是我们在对一个程序进行逆向分析之前,除了程序的动态行为之外,查看程序是否加壳(被何种程序加壳?是什么编译器编译的?)也是一个非常关键的步骤。之前提到了PEID,我们就用PEID来查壳我们选中程序后单击右键,在右键菜单中选择“Scan
with PEiD”选项,就可以查看加壳信息了。我们这里看到的是Microsoft Visual C++
6.0,说明CrackMe1.exe没有加壳,且它是使用VC6编译的。

图片3.png

我们换OD来进行动态调试,

动态调试可以帮助我们了解程序内部执行逻辑的许多详细信息,很多信息只有在程序运行起来之后才会看到,这也是静态分析所无法简单获取到的。OD是我们在Windows操作系统下动态调试器的首选。

操作选择CrackMe1.exe程序后单击右键,在右键菜单中选择“用OllyICE”打开,就会进行OD调试器的主界面,我们在反汇编指令列表窗口中单击右键,依次选择“Ultra
String Reference”、“Find ASCII”菜单项,如图所示:

图片4.png

之后会弹出字符串列表窗口,这个窗口列出了当前进程内存空间中存在的各种字符串,我们可以查看是否存在有我们感兴趣的字符串。比如前面曾经提示“密码错误”的提示,那么我们就可以按下Ctrl+F,在弹出的窗口中输入“密码错误”,然后单击确定按钮查找:

图片5.png

上面还有一个密码正确,恭喜过关,这是不是关键呢?我们试一试双击这个看看。

双击找到字符串的那一行,来到OD的反汇编窗口,就能看到代码指令中引用这个字符串的地方了。如下图所示:

图片6.png

在这个代码片段中,我们还看到了一个jnz跳转指令,这个指令是否跳转将决定着弹出成功的提示还是弹出失败的提示,这样的跳转也就是所谓的关键跳转。在关键跳转之上的代码往往就是关键的密码判断逻辑,因此我们可以着重分析关键跳转之上的代码。在关键跳转之上,我们在下面的的位置下一个断点(鼠标单击这行代码选中,然后按下F2):

00401456. 55 push ebp

下好断点之后,按下F9运行程序,随便输入一个密码(比如test)后单击按钮,程序就自动在我们的断点断下了,接下来按F8开始进行单步跟踪,当跟踪到00401490的时候,我们发现了我们输入的密码test,同时发现字符串HeeTianLab,如图所示:

图片7.png

仔细分析上面的代码,发现是在从这两个字符串里面取出字符一个一个进行对比,只要有一个字符不一样,最终都会跳转到提示失败的地方去。那么可以猜测HeeTianLab就是正确的密码了,我们运行另一个CrackMe1进程,输入HeeTianLab,弹出成功提示:

图片8.png

这就通关了,接下来我用另外一个神器IDA再来做一遍,有动态的神器,肯定还有一个静态的神器。

除了动态调试之外,静态分析也是一种很重要的技能。静态分析可以帮助我们快速了解程序的代码执行逻辑,尤其是使用IDA的Hex-
Rays插件将汇编代码生成伪代码的功能,可以极大地提高我们的分析效率。

使用IDA打开CrackMe1.exe程序,IDA会提示选择文件类型、处理器类型等,通常我们不需要修改这些设置,直接单击“OK”按钮即可。之后IDA会对程序进行分析,等待一段时间,待分析结束之后,在下方的“Output
Window”中会提示“The initial autoanalysis has been finished.”,如图:

图片9.png

在IDA的菜单中选择“View”——“Open subviews”——“Strings”菜单项,就可以弹出字符串列表界面了,如图所示:

图片10.png

IDA的字符串列表界面没有提供Ctrl+F快捷进行查找的功能,所以我们需要手工翻页来查找我们感兴趣的字符串,拖到某一个地方的时候我们看到了提示相关的字符串:

图片11.png

双击“密码错误”这个字符串,来定定义该字符串的地方,然后鼠标点击字符串的名字,然后按下x键,进行交叉引用查找,弹出的对话框如下图所示:

图片12.png

单击OK按钮来到引用这个字符串的地方,我们看到了一堆反汇编指令列表,这时候就可以对这里的汇编指令进行分析了,如果不想看汇编指令也不要紧,按下F5键就可以生成函数的伪代码了,我们看到伪代码中将输入的密码和HeeTianLab进行了比较:

图片13.png

很明显,HeeTianLab就是我们想要的密码。

逆向的学习是一个需要对计算机相关及编程知识系统有较深了解的过程,它是一个不断渐进的阶段性技能。想学好逆向,你必须具备众多的编程语言储备、安全相关知识、对计算机原理有良好的认识和常识。而这些只是逆向的基础!

HeeTianLab就是我们想要的密码。

逆向的学习是一个需要对计算机相关及编程知识系统有较深了解的过程,它是一个不断渐进的阶段性技能。想学好逆向,你必须具备众多的编程语言储备、安全相关知识、对计算机原理有良好的认识和常识。而这些只是逆向的基础!

如果你对网络安全入门感兴趣,那么你点击这里👉CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

如果你对网络安全感兴趣,学习资源免费分享,保证100%免费!!!(嘿客入门教程)

👉网安(嘿客)全套学习视频👈

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

img

img

👉网安(嘿客红蓝对抗)所有方向的学习路线****👈

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

img

学习资料工具包

压箱底的好资料,全面地介绍网络安全的基础理论,包括逆向、八层网络防御、汇编语言、白帽子web安全、密码学、网络安全协议等,将基础理论和主流工具的应用实践紧密结合,有利于读者理解各种主流工具背后的实现机制。

在这里插入图片描述

面试题资料

独家渠道收集京东、360、天融信等公司测试题!进大厂指日可待!
在这里插入图片描述

👉嘿客必备开发工具👈

工欲善其事必先利其器。学习客常用的开发软件都在这里了,给大家节省了很多时间。

这份完整版的网络安全(客)全套学习资料已经上传至CSDN官方,朋友们如果需要点击下方链接也可扫描下方微信二v码获取网络工程师全套资料【保证100%免费】

如果你有需要可以点击👉CSDN大礼包:《嘿客&网络安全入门&进阶学习资源包》免费分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/792168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP ABAP 用户状态锁定案例

一、前言 项目需求是根据当天及前两天的离职员工信息(假设这是一个定时器任务每天下午5点执行程序,计算前两天的员工工号是为了将5点之后办理离职的员工工号找出来),将这些员工在用户表 USR02 中的锁定状态设置为 “64”&#xff…

“奢侈品”价格的“快消品”,竹叶青这么想赚年轻人的“茶水钱”?

文 | 螳螂观察 作者 | 青月 或许是受养生焦虑的影响,这届年轻人似乎爱上了喝茶。 《抖音电商茶行业洞察报告》数据显示, 年轻客群已经成为了抖音电商茶行业的增长极,在茶叶、茶具、茶文化书籍等方面,18-30岁消费者是当之无愧消…

022 - DISTINCT

SQL SELECT DISTINCT 语句 在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。 关键词 DISTINCT 用于返回唯一不同的值。 -- 语法: SELECT DISTINCT 列名称 FROM 表…

如何给侧边栏添加 Badge 计数标记

一、需求功能 给侧边菜单栏或及子菜单栏添加计数标记 el-badge 效果如下&#xff1a; 二、实现思路 结合 icon 图标渲染的思路&#xff0c;通过在layout 的 item.vue 中使用 vnodes.push 方法实现对 <el-badge /> 的渲染。在通过 Vuex 的状态管理将菜单栏需要的数据转…

测试自动化面试题

Python python有哪些数据类型? Python支持多种数据类型&#xff0c;包括以下常见的数据类型&#xff1a; 数字类型&#xff1a;整数&#xff08;int&#xff09;、浮点数&#xff08;float&#xff09;和复数&#xff08;complex&#xff09;。 字符串类型&#xff1a;由字…

Mysql-MVCC 并发版本控制

参考链接&#xff1a;一文读懂MVCC实现原理_Nicolos_Z的博客-CSDN博客 1.总述&#xff1a; MVCC 主要是InnoDB解决数据库事务读写&#xff0c;导致的脏读、重复读问题的处理方法。通过快照读的方式&#xff0c;提高数据库并发查询的能力。 2.MVCC的实现 实现MVCC主要用到了…

【隐式动态求解】使用非线性纽马克方法的隐式动态求解研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码实现 &#x1f4a5;1 概述 非线性纽马克方法&#xff08;Nonlinear Newton-Raphson method&#xff09;是一种用于求解非线性方程组的数值方法&#xff0c;其中包含了隐式…

智慧景区综合解决方案52页,多媒体触控系统,顶层设计

导读&#xff1a;原文《智慧景区综合解决方案52页ppt》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 完整版领取方式 完整版领取方式&#xff1a; 如需获取完整的电…

C++语法(26)--- 特殊类设计

C语法&#xff08;25&#xff09;--- 异常与智能指针_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131537799?spm1001.2014.3001.5501 目录 1.特殊类设计 1.设计一个类&#xff0c;不能被拷贝 C98 C11 2.设计一个类&#xff0c;只能在堆上…

Volatile关键字详解

Volatile关键字详解 volatile的定义 这个引用JSR中的定义&#xff1a; The Java programming language allows threads to access shared variables (17.1). As a rule, to ensure that shared variables are consistently and reliably updated, a thread should ensure tha…

工业边缘计算为什么?

在工厂环境中使用边缘计算并不新鲜。可编程逻辑控制器&#xff08;PLC&#xff09;、微控制器、服务器和PC进行本地数据处理&#xff0c;甚至是微型数据中心都是边缘技术&#xff0c;已经在工厂系统中存在了几十年。在车间里看到的看板系统&#xff0c;打卡系统&#xff0c;历史…

【java实习评审】对热门小说更新时的聚集访问流量进行性能优化优化,有较好的设计

大家好&#xff0c;本篇文章分享一下【校招VIP】免费商业项目“推推”第一期书籍详情模块java同学的文档周最佳作品。该同学来自西安建筑科技大学软件工程专业。 本项目亮点难点&#xff1a;1 热门书籍在更新点的访问压力&#xff0c;2 书籍更新通知的及时性和有效性&#xff…

IP网络对讲求助模块

SV-6002 IP网络对讲求助模块是一款壁挂式一键求助对讲模块&#xff0c;具有10/100M以太网接口&#xff0c;其接收网络的音频数据&#xff0c;实时解码播放&#xff0c;还配置了麦克风输入和扬声器功放输出。SV-6002模块可实现对讲、广播、等功能&#xff0c;作为网络广播对讲系…

管理类联考——数学——趣味篇——可视化

Manim: 一个数学可视化的动画引擎 官网&#xff1a;https://3b1b.github.io/manim/index.html 借鉴&#xff1a;做出高逼格的数学动画——一起来学manim入门篇&#xff08;一&#xff09; 安装Manim软件 借鉴&#xff1a;Python视频制作引擎Manim安装教程 通过git bash运行…

探索NE555:一款经典的集成电路(超详细)

NE555是一款经典的集成电路&#xff0c;它在电子领域被广泛应用于定时器、脉冲发生器、电压控制振荡器等各种应用场景。它的设计简单、易于使用&#xff0c;并且具备稳定可靠的性能&#xff0c;因此深受电子爱好者和工程师的青睐。本篇博客将详细介绍NE555的原理、工作模式和常…

三、函数-2.字符串函数

一、常用函数 二、示例 -- 字符串拼接 Hello MySQL select concat(Hello, MySQL);-- 转为小写 hello select lower(Hello);-- 转为大写 HELLO select upper(Hello);-- 向左填充 &#xff01;&#xff01;&#xff01;01 select lpad(01, 5, &#xff01;);-- 向右填充 …

需求管理中最易忽视的6大重点

需求管理是产品经理的重点工作&#xff0c;如果无法有效进行需求管理&#xff0c;往往会引起需求变更、项目延期以及成本增加等问题。那么如何对需求进行高效管理&#xff0c;我们在需求管理中&#xff0c;往往最容易忽视的重点都有哪些&#xff1f; 1、重视项目整体管理计划 首…

redis高级篇 springboot+redis+bloomfilter实现过滤案例

一 bloomfilter的作用 1.1 作用 Bloomfilter&#xff1a;默认是有0组成bit数组和hash函数构成的数据结构&#xff0c;用来判断在海量数据中是否存在某个元素。 应用案例&#xff1a;解决缓存穿透。Bloomfilter放在redis前面&#xff0c;如果查询bf中没有则直接返回&#xff…

华为数通HCIP-OSPF路由计算

路由协议 作用&#xff1a;用于路由设备学习非直连路由&#xff1b; 动态路由协议&#xff1a;使路由设备自动学习到非直连路由&#xff1b; 分类&#xff1a; 按照算法分类&#xff1a; 1、距离矢量路由协议&#xff1b;&#xff08;RIP、BGP&#xff09; 只交互路由信息…

C语言每日一题——倒转字符

今天分享一道题目 编写一个函数 reverse_string(char * string)&#xff08;递归实现&#xff09; 实现&#xff1a;将参数字符串中的字符反向排列&#xff0c;不是逆序打印。 要求&#xff1a;不能使用C函数库中的字符串操作函数。 char arr[]"abcdef";将上面的代…