美文网首页网络安全实验室
逆向入门——两个小程序的Crack过程

逆向入门——两个小程序的Crack过程

作者: 蚁景科技 | 来源:发表于2018-11-13 16:06 被阅读45次

    逆向工程在ctf比赛中有着举足轻重的地位,这次带逆向小白体验一下两道最基础的逆向题目。

    disassemble.exe逆向

    看看这个程序是用来干什么的

    输入正确的密码,来获取flag

    老套路,看一下有没有加壳

    显示有UPX壳,那就脱壳吧

    UPXUnpacker脱壳

    脱壳完成

    再次查看连接器版本

    已经显示没有壳了,连接器版本是vc++6.0

    说一下思路

    跟踪比较函数,找出程序中存储的密码字段

    修改程序逻辑(如果是某种条件跳转)

    修改寄存器状态(当然也是基于某种条件跳转)

    扔进OD运行

    查看字符串

    输入错误密码后会输出“密码错误,退出”的字符串,因此可以尝试找到这个字符串,然后从下往上查找比较逻辑的代码

    选择查找ASCII字符串

    追踪代码

    从这串字符串的代码往上翻一翻,发现了用于密码判断的逻辑

    下个断点,让程序跑到这里

    TEST命令

    作用:test指令是将两个操作数进行与操作,但并不将结果存储于目的操作数中,仅根据结果设置各个标记为,后面常常会跟各种条件指令。

    特别地,testax,ax 这种,即源操作数和目的操作数相同的情况,即为比较此操作数的值和0之间的关系。

    比较完后jnb条件跳转

    已经显示没有壳了,连接器版本是vc++6.0

    说一下思路

    跟踪比较函数,找出程序中存储的密码字段

    修改程序逻辑(如果是某种条件跳转)

    修改寄存器状态(当然也是基于某种条件跳转)

    扔进OD运行

    查看字符串

    输入错误密码后会输出“密码错误,退出”的字符串,因此可以尝试找到这个字符串,然后从下往上查找比较逻辑的代码

    选择查找ASCII字符串

    追踪代码

    从这串字符串的代码往上翻一翻,发现了用于密码判断的逻辑

    下个断点,让程序跑到这里

    TEST命令

    作用:test指令是将两个操作数进行与操作,但并不将结果存储于目的操作数中,仅根据结果设置各个标记为,后面常常会跟各种条件指令。特别地,testax,ax 这种,即源操作数和目的操作数相同的情况,即为比较此操作数的值和0之间的关系。比较完后jnb条件跳转

    条件跳转表

    修改跳转代码实现不跳转

    将jnb代码用nop(空代码)填充

    这样一来,就不会跳转了

    修改寄存器

    将CF位修改为1,jnb将不会跳转

    成功得到flag

    CrackMe.exe

    拿到一个exe文件,打开看一看

    发现是一个输入用户名和序列号的一个程序

    查一下有没有加壳

    发现并没有加壳,直接扔进OD打开

    F9先跑一跑

    输入错误的用户名和序列号会弹出错误提示框,预测程序逻辑是把输入框中的字符串和程序中存储的字符串比较。因此,初步的目标是找到比较的函数,从函数中找到用于比较的字符串。

    查看CrackMe模块调用的API函数快捷键(Alt+E

    点进去,选择CrackMe模块

    CtrlN进入查看模块调用的API函数

    可以看到很多调用的函数,我猜测程序调用了API函数,从对话框中获取字符串,因此,需要关注一些获取对话框字符串的敏感API函数,锁定GetDlgTextA函数(这里的A指的是ASCII编码,W结尾表示宽字节Unicode)

    右键在这个API函数调用的地方下断点

    在这里下断点不清楚是否操作成功,Alt+B看一下断点情况

    显示的确成功下断点,PS:断点窗口可以设置断点是否有效,这里显示Always表示断点生效,如果是Disable,表示暂时禁用了这个断点,断点一般最好不要删掉,禁用即可,断点调试来之不易,且下且珍惜233

    另一个在API下断点的方式

    OD一个强大的功能是可以添加很多第三方插件,对逆向有很大帮助,我的OD是吾爱下的,带了一些Plugin,这里用的是API断点插件

    选择对话框中的GetDlgTextA

    小白最好还是完整走一次过程,加深印象:)

    F9开始运行程序,到达我们设置的API断点处

    这个函数将输入的用户名和序列号传入程序中,进行下一步比较

    F7单步跟踪

    关注堆栈窗口,调用函数时,传入的参数会被压进堆栈

    继续单步跟踪

    找到了比较函数,函数中,将我们输入的字符串和1008比较,大致可以确定1008是我们要的序列号

    打开程序,输入正确的用户名和序列号


    本文仅用于普及网络安全知识,提高小伙伴的安全意识的同时介绍常见漏洞的特征等,若读者因此做出危害网络安全的行为后果自负,与合天智汇以及原作者无关,特此声明。

    相关文章

      网友评论

        本文标题:逆向入门——两个小程序的Crack过程

        本文链接:https://www.haomeiwen.com/subject/qrjlfqtx.html