分析并写出下列程序的运行结果_CTFer成长之路--一道历届逆向题解题过程(包含脱壳、算法分析)...

ebd299bd4e1029012d6f353dd9da4ba1.png

前言

CTF 是实战性很强的赛事。仅学习理论知识,不进行实操,永远无法成为 CTF 大神。从本篇博客开始,我将选择有代表性的历年CTF比赛题目,介绍解题过程,工具使用以及讲解知识点。

题目介绍

本次讲解的是出自2017年第三届上海市大学生网络安全大赛的一道逆向题,题目分值50分,主要考点有算法分析、nspack脱壳、主流工具使用等。

准备工具

  1. ExeinfoPe 工具,可以查询软件信息
  2. OD 反汇编工具,用于动态调试
  3. OllyDumpEx 工具,进程内存转储器,OD 中默认包含 OllyDump 插件
  4. IDA 反编译工具,逆向界的神器。

解题过程

  1. 运行软件
    直接在虚拟机中运行程序。可以发现,如果输入的flag 错误,软件直接退出运行。

9c950dd019508870dbb03108261d90ed.gif
  1. 用 ExeinfoPe 查看软件信息

4ef33449cbd44654750920791971cbdd.png


可以看到软件是32位的Windows console 程序且加了 nsPack 3.x 壳。

  1. 使用 esp 定律法脱壳
    将软件用OD打开,按下F8单步运行。

c963bb305c30f860b2ff5f71d931aff0.png

可以看到只有 ESP 寄存器是红色的,即数据有变化。
在 ESP 寄存器上点击右键,选择数据窗口中跟踪。
在左下角的数据窗口内,选择 ESP 地址中的字节,点击右键选择断点->硬件访问->Dword 。

818ab17fc6696e571902460cba6c6b46.png

断点设置好之后,按下 F9 运行。程序运行会被断点暂停。被断下的指令是 popfd 。为啥会在这个指令被断下会在后面分析到。

c9395387d174801a096d64d41da53f2e.png

按下两次F8过后,经过一个长跳转指令,基本就靠近了 OEP(程序的入口点)。这时候需要右键选择分析->从模块中删除分析。

8e66ba83730393bad5a587e53736ca2a.png

删除分析后,再点击两次 F8 就看到熟悉的程序开头了。在地址0x401340处点击右键,用 OllyDumpEx 插件,将壳内的程序 dump 出来。

38cea582061726fca65477f1d08e7ba6.png

将脱壳后的程序点击运行,发现能正常运行,脱壳成功。

  1. 分析 程序算法 将脱壳后的程序放到 IDA 中,按下快捷键 Shift + F12 打开 String 窗口。在String 窗口,我们看到了一些有用的字符串。例如:“right!n”字符串应该是输入正确flag后的提示信息。 ![查看字符串](IDA string.png) 双击字符串跳转过去后,使用快捷键 Ctrl + X 查找该字符串被调用的地方。可以看到只有一处调用,点击OK。

ef342aca3eb10ee3f53efca09a2f3a5f.png

在 IDA View-A 窗口处,按下快捷键 F5, 通过IDA 分析的伪代码出来了。

7055083a509d41a165f54a5c5745d0b8.png

IDA 还原出来的伪代码虽然难看了一点,但是逻辑还是比较好理解的。首先看第12行,要求输入字符串长度为42。然后从地址 0x402130 循环取一个字符和输入的值进行按位与运算。如果运算结果和 0x402150 地址相等持续循环,直到循环结束。

  1. 编写解密脚本
    了解伪代码后,我们使用 IDA 中的 IDApython工具编写解码程序。解码代码和输出结果如下:

1fe2cfb74edc7067bf817a5b6ec291d7.png

可以看到在左下角输出了 flag。 到此步骤,题目已经解出来了。flag为:
flag{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75}


码字不容易,写技术博客更不容,大家喜欢的话给个赞顺便给个关注呗~


主要知识点梳理

1. OD 中的各类断点

在脱壳之前,我们对地址 0x12FF68 下了硬件断点。通过菜单可以看到,OD中有两种类型的断点,分别是内存断点和硬件断点。内存断点原理
前提:①每一个程序运行时候都会申请一段内存地址并设置内存页的属性。例如:申请时可以设置该内存页内只存放数据,不执行代码等。②程序调试运行时,调试器比被调试程序提前获取系统下发的异常消息。 使用OD程序调试时,若我们设置了内存断点,OD将在该内存页添加一个属性,叫做PAGE_NOACCESS。从属性名可以看到,如内存页设置此属性后,将无法被访问或被访问产生异常。程序运行访问下软件断点的地址时,OD通过调试器信息将程序暂停下来。硬件断点原理
前提:①在寄存器中,有一组寄存器用于调试。他们分别是 Dr0-Dr7。其中 Dr0-Dr3四个调试寄存器存放中断的地址。Dr4-Dr5 一般保留不用。 Dr6-Dr7 两个用来记录Dr0-Dr3中下断点的地址的属性。例如:Dr0 中下断点的地址是硬件读还是写,还是执行;或是字节还是双字等。 ②硬件断点是CPU层面支持的。补充:这个也就是为什么硬件断点只有四个的原因(因为只有四个寄存器用于存放断点地址)。
使用OD程序调试时,若我们设置了硬件断点,OD本身不做什么复杂的操作,只是把我们的需求转化格式写入 Dr寄存器,等待系统反馈即可。

2.ESP 定律原理
ESP定律又称堆栈平衡定律,是当前使用最频繁的脱壳方法,无论是CTF新手还是老手都能用到。 壳实质上是一个子程序,它的作用是真正的程序运行之前获得控制权并对程序进行压缩,隐藏真正的OEP。因为真正的程序OEP被壳隐藏了,我们需要脱壳才能找到程序的OEP。 当我们将程序放入OD后,两次按下F8运行时,只有 ESP 寄存器变红,有了变化。 若对比加壳的程序入口的各寄存器值和OEP时各寄存器的值发现只有 EIP 和 EAX寄存器值发生了变化,而EAX中保存的是 OEP的地址。这是什么原因呢?

由于在程序自解密或者自解压过程中, 多数壳会先将当前寄存器状态压栈, 如使用pushad, 而在解压结束后, 会将之前的寄存器值出栈, 如使用popad. 因此在寄存器出栈时, 往往程序代码被恢复, 此时硬件断点触发(这就是我们要下硬件断点的原因),然后在程序当前位置, 只需要一些单步操作, 就会到达正确的OEP位置。

3. IDA 分析中的线索
使用 IDA 对软件完成了反汇编后,一般有以下几种方法查找关键点(关键代码): 1. 查找字符串。使用快捷键 Shift+F12 弹出的 String窗口中,查看字符串。一般脱壳后,很容以找到一些关键信息。本题目中,我们用到了字符串 "right!n" 2. 查找函数名。在 Functions window 窗口里,搜索main,如果是consle 代码,一般都从main函数开始运行,此处为关键点。 3. Imports 窗口。 在 Imports 窗口里展示的是程序调用的系统函数。可以通过 printf 、 scanf 等函数定位关键点。
本次我们直接在字符串中找了关键线索。 后面两个方法也是可行的。

4. IDA Python 使用
IDA 是 DataRescue公司出品的交互式反汇编工具,功能强大,操作复杂,完全掌握他需要学习很多知识。本博客篇幅有限,只介绍本题目中用到的内容。IDApython 是一种在IDA工具中运行的脚本,可以对IDA中呈现的汇编指令和数据进行操作,简化我们的工作,加快我们的分析。 IDApython 是python语言的一种,相比python语言多了一些函数库。接下来,针对本题中用到的功能进行介绍。 IDA中直接 Shift + F2 就能弹出 IDApython 执行窗口。脚本支持 地址获取、数值获取、操作码获取、搜索操作、数据判断操作、数据修改、函数操作等内容。 本例题中使用GetManyBytes函数获取地址从0x402150开始的168个字节数据。 ord 和 chr是python内置的函数不做解释。

写在结尾

本题非常适合作为 CTF 逆向基础题型进行练习,包括了基础的算法分析、主流工具使用、简单脱壳等内容。


本博客从开始写到最后完成花了4.5小时,发现写博客真心不容易,如果你喜欢的话给个赞顺便关注我呗~ 在此谢过 ~


参考:
1.https://zhuanlan.zhihu.com/p/117294551
2.ollydbg中的内存断点和硬件断点有什么区别? - 旅人的回答 - 知乎 https://www.zhihu.com/question/52625624/answer/131557817

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值