CTF REVERSE练习之API定位

今天要做的实验是CTF REVERSE练习之API定位。

Windows这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外, 它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程式达到开启视窗、描绘图形、使用周边设备等目的,由于这些函数服务的对象是应用程序(Application),所以便称之为 Application Programming Interface,简称 API 函数。

另外需要注意的是两种编码,ANSI与Unicode,ANSI的ASCII字符集及其派生字符集(也称多字节字符集)比较旧,而Unicode字符集比较新,固定以双字节表示一个字。Windows操作系统在声明一个API时,如果这个API存在字符串参数,便会指定字符集。每个含有字符串参数的API同时有两个版本:即ANSI,Unicode。尾部带A的API是ANSI版本,带W的API是Unicode版本。

例如:我们在编程时使用的MessageBox实际上是一个宏,根据字符集的不同被定义为不同版本的MessageBox,如果是UNICODE字符集,则实际上为MessasgeBoxW,如果是ANSI字符集,则实际上为MessageBoxA:

#ifdef UNICODE

#define MessageBox MessageBoxW

#else

#define MessageBox MessageBoxA

#endif // !UNICODE

交叉引用。

通过交叉引用(XREF)可以知道指令代码相互调用的关系,如下图所示:

这句“CODE XREF: WinMain(x,x,x,x)+10↑p”,表示调用sub_41BD0D这个函数的地方为WinMain函数,p表示是以函数调用(procedure)的方式跳转到当前的位置的,其他的一些符号:o表示偏移值(offset),j表示跳转(jump)。

在sub_41BD0D上面按X键,可以打开交叉引用窗口,这里会列出所有调用了sub_41BD0D这个函数的地方,如图所示:

从图中可以看到,只有在WinMain函数中调用了sub_41BD0D这个函数。

现在我们开始进行实验,进入实验链接《CTF REVERSE练习之API定位》

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

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

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

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

通过这些操作后,我们可以猜测程序的意图是输入一个正确的密码。

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

我们来试一试使用OD载入CrackMe2.exe程序,如果继续使用实验《CTF REVERSE练习之逆向初探》中提到的方法查找字符串,是找不到的,会有如下提示:

继续看我们在反汇编指令列表中单击右键,在右键菜单中依次选择“查找”——“当前模块中的名称(标签)”,如图所示:

点击弹出的名称窗口,在键盘上敲下MESSAGEBOXA,就会自动定位到MessageBoxA,点击鼠标选中MessageBoxA这一行,单击右键,在弹出的右键菜单中选择“在每个参考上设置断点”,如图所示:

在OD最下方的状态栏上可以看到“已设置 2 个断点”的提示。

现在按F9运行程序,随便给程序输入一个密码(如test),单击确定按钮后程序将在OD中断下,断下的位置为对MessageBoxA的调用的位置,如图所示:

这就是我们要找的关键函数,现在我们查看附近的代码,就找到了密码明文,如图所示:

用OD解题之后,我们继续用IDA来解题一下。

使用IDA载入CrackMe2.exe程序进行分析,等待分析完毕后,选择主窗口面板上的Imports TAB页面,然后在键盘上敲下MESSAGEBOXA,就可以自动定位到MessageBoxA函数,如图所示:

前面提到了交叉引用这里我们可以用到双击00422420这个条目,来到MessageBoxA定义的位置,选中后按下X键,弹出交叉引用列表窗口,我们看到一共有四个条目,如图所示:

我们并不能直接看出哪一个引用就是我们所要找的引用,所以需要一个一个进行查看,根据前面使用OD对程序的分析,我们知道在MessageBoxA之前有许多对LoadString的调用,因此通过对比几个交叉引用,可以断定sub_401450就是我们要找的函数。

使用F5还原sub_401450函数的伪代码,我们断定LoadString加载资源ID为0x6A的字符串就是我们要找的密码,伪代码如下:

接下来我们使用Restorator打开CrackMe2.exe程序来查看字符串资源,如图所示,0x6A的十进制即106,因此可以知道密码就是HeeTianLab了。

那今天的实验就介绍到这里。我们需要好好掌握API还有后面的实验内容。

(0)

相关推荐

  • Win32 API编程——前言

    一丶什么是Win32 API? 微软为了保护操作系统的安全性和稳定性,把系统分为内核层和用户层(内核层的代码只能在当CPU的特权级为R0状态下执行,用户层的代码在CPU特权级为R0和R3都能执行),w ...

  • CTF REVERSE练习之病毒分析

    首先介绍两个知识点,在后面的实验中运用到的. 1.7Zip 7-Zip 是一款开源软件.我们可以在任何一台计算机上使用 7-Zip ,包括用在商业用途的计算机.7-Zip 适用于 Windows 7 ...

  • CTF REVERSE练习之脱壳分析

    今天要介绍脱壳分析的实验.壳,在自然界中,植物用壳来保护种子,动物用壳来保护身体等.同样,在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序.他们附加在原程序上通过Windows加载 ...

  • Android 手机app三种方法获取定位地址(自带API,外接SDK,获取外网IP)

    一.手机App定位在我看来有三种方法: 1.通过Android自带的API:LocationManager获取到经纬度,再通过Geocoder反地理位置查询到所在的地址. 2.外接SDK,如高德SDK ...

  • 旅界专研 | 文旅企业类型的再划分与战略再定位(下篇)

    编者按:随着原国家旅游局和文化部合并成立新的文化和旅游部.国家自然资源部的组建,以及国家公园.国家文化公园的创建,国有旅游景区门票下降政策的普遍实施,叠加宏观经济下行.资本市场去杠杆以及新冠肺炎疫情的 ...

  • 如何衡量你的组织定位--麦肯锡7S模型?

    麦肯锡7S框架由麦肯锡公司员工汤姆·彼得斯和罗伯特·沃特曼于1980年代初期开发,并被全球管理咨询公司麦肯锡(McKinsey)用作基本工具,从那时起,它就被称为7-S模型. 麦肯锡7S模型是组织有效 ...

  • 致青年律师:这样“定位”自己,案源不来都难

    作者丨韩冰 来源丨这就是律诗 人们很难分清楚张馨予.张予曦.张雨馨.张歆艺.张艺馨分别是谁,而且,他们不会费精力去区分,他们会直接把这类名字全部忽略.同理, 各个网站投放千篇一律.相似度99%的律师简 ...

  • 心电图导联如何定位心梗

    心电图图库大全 心电图导联如何定位心梗 急性心肌梗死是冠状动脉急性.持续性缺血缺氧所引起的心肌坏死.临床上多有剧烈而持久的胸骨后疼痛,休息及硝酸酯类药物不能完全缓解,伴有血清心肌酶活性增高及进行性心电 ...

  • 用PLC怎么实现编码器的定位功能详解!

    因为情怀还未了 所以四海为家 欢迎转发朋友圈,欢迎收藏 严格来讲,编码器只会告诉你改如何定位,要如何执行,是需要靠PLC之类控制器或者步进电机来实现定位的,编码器好比人的眼睛,知道电机轴或者负载处于当 ...

  • 玉器收藏方向如何定位

    玉器收藏方向如何定位?民间玉器收藏基本走向有哪些,下面小编给大家介绍下: 一.古玉收藏:古玉较之于新玉,沁色无穷,刀法古朴,又是一种文物,令人不禁生出慕古的遐想收,其意境妙不可言.收藏古玉是玉器收藏投 ...