Reverse-OD反调试

目录

前言

题目描述

WriteUp

静态分析

解题步骤

绕过进程检测

绕过运行窗口检测

子函数1-绕过调试端口检测

子函数2-绕过基于时间的反调试

子函数3-绕过输入合法性检测


前言

利用调试工具绕过身份验证或异常检测是逆向工程的基础技术,但有的可执行程序专门用了一些手段来阻止调试,本文主要讲解如何绕过这些阻止手段,正常使用调试工具解题

题目描述

题目附件只有一个fts.exe可执行文件,如下图所示

WriteUp

拿到一个逆向类题目,我们需要先分析一下这个可执行文件是Windows下的PE文件还是Linux下的ELF文件,如果是PE文件我们需要用OD调试工具,而ELF文件需要用Linux下的GDB调试工具

我们先用Linux的file命令去查看文件格式

从结果可看出,该文件是一个32位的PE文件,下面用 IDA 打开该文件进行静态分析

静态分析

经过反汇编和反编译后找到main函数

main

先分析一下main函数,该函数中先用do-while循环输出了几个字符,接下来用FindWindowW函数判断OD和IDA工具是否运行,如果都没运行则进入if语句块中,先用do-while循环输出几个字符,然后依次执行三个子函数sub_4010F0(),sub_4011A0()和sub_401230()

我们进入三个子函数看一下

sub_4010F0

调用Ntdll.dll链接库中的NtQueryInformationProcess函数去检测调试端口,这里做的是基于调试端口的反调试,如果发现在调试(v5>0)则退出,否则进入do-while循环输出几个字符

sub_4011A0

__rdtsc()是保存时间的函数,这里做的是基于时间的反调试,只有当v2的时间大于v5时才认为是正常运行,之后进入do-while循环输出几个字符

sub_401230()

这个函数中倒是没有反调试措施,只是考了一点点栈溢出的知识,让用户输入一个合适的buf值覆盖v4,使得 if 条件成立,进而进入do-while循环输出几个字符

分析到这里已经很清晰了,这是一道考察反调试的CTF题目,我们需要绕过众多的反调试措施(运行窗口,调试端口,保存时间),进入到各个do-while循环中,使程序输出字符,这些输出的字符合起来就是我们想要的 flag

下面详细介绍绕过步骤

解题步骤

我们先用OD调试器打开,尝试直接运行

发现会直接终止,输出一些看不懂的字符,意思大概就是检测到OD正在运行

既然直接运行拿不到提示,我们就从汇编语言出发

以下的步骤需要明白一个基本逻辑:程序是通过判断是否存在运行窗口、调试窗口、时间跨度来判断是否处于调试状态的,因此只需要控制判断不跳转,强行进入do-while循环中输出字符,最终就能得到我们想要的结果

绕过进程检测

先用F8进行单步跟踪,跟踪到 je short 009C10D1时发现会跳转到“face the od”处,结合刚开始的尝试可判断,这里就是检测到OD进程后跳转的逻辑,我们需要控制不跳转,或直接跳转到do-while循环处

这里我选择控制跳转逻辑不跳转,修改跳转地址为紧挨的下一条指令地址,相当于不跳转

绕过这里的跳转逻辑后找到main函数(可用智能搜索找到“走过八十一难”那里,那里就是main函数刚开始的地方),在main函数内下断点,然后用F9键跳过去,发现成功进入了循环输出字符(循环的标志是反向跳转或loop等指令)

控制台已经输出了几个有用的字符

绕过运行窗口检测

继续跟踪会发现使用了user32.FindWindow函数检测有没有运行OD和IDA

现在我们需要做的是控制下面两个je指令不跳转,这样就会成功进入循环打印字符

仍然是将 je 的跳转地址改为紧挨的下一条指令地址

之后成功运行到了三个子函数的地方

此时控制台的输出如下

子函数1-绕过调试端口检测

用F7键步入单个函数进行调试,这个函数需要绕过调试端口的检测

仍然是修改跳转地址,控制不跳转

成功绕过后控制台输出如下

子函数2-绕过基于时间的反调试

在第二个子函数中,我们可以看到rdtsc命令,这是用于保存时间的指令,进行的是基于时间的反调试,我们可以直接在下面的popad指令处下断点,然后用F9键跳过

成功绕过后控制台输出如下

子函数3-绕过输入合法性检测

子函数3中有一个gets函数获取用户输入,这个并不重要,随便输入就可以,重要的是下面有个jbe指令会跳过printf函数(打印字符),我们需要控制这个jbe指令不跳转,仍然通过修改跳转地址的方式

成功后控制台输出完整的 flag(666是我随便输入的)

因此得到最终的flag为flag{congratulations_for_you}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值