BUUCTF——CrackMe 反调试操作

CrackMe Wp

这题主要是反调试

而且不是不让你调试,而是加入了很多干扰项,很磨人

下面列举出这道题的反调试操作

上述操作主要集中在 sub_401830 函数中

本题的反调试
第一处

在这里插入图片描述

由这张图可以知道

*((_DWORD *)NtCurrentPeb()->ProcessHeap + 3)//代表HEAP结构体的第0xc偏移的成员,即Flags

而 第三个flags成员和第四个ForceFlags成员被用作反调试 正常情况下flags的值为2 ForceFlags的值为0

第二处

这是时钟检测进行反调试,但是这里应该没有用作反调试,但是既然出现了,就提一下。以下是原理:

rdtsc指令将时间标签计数器读入 EDX:EAX。

img

Windows系列操作系统的时间间隔10 - 20 毫秒,软件正常运行时的速度比我们分析代码时快得多,所以可以比较上下两句代码的时间戳,来判断程序是否被调试。

img

第三处

PEB 有一个名为NtGlobalFlag(32位系统下偏移量0x68)的字段,程序可以挑战该字段以确定它们是否正在被调试。通常,当进程未被调试时,NtGlobalFlag字段包含值0x0。调试进程时,该字段通常包含值0x70

第四处

BeingDebugged成员是一个标志(Flag),用来标识进程是否处于被调试状态。 进程处于调试状态时,PEB.BeingDebugged成员(+0x2)的值被设为1TRUE);进程在非调试状态下运行时,值被设置为0(FALSE)

第五处

若处于调试状态,则GetStartupInfo得到的StartupInfo里面的参数都会被置为0,处于调试状态的话就会进入干扰项

过程

我的做法是,全部nop掉即可

具体过程不写了,参考这个师傅写的

buuctf-crackMe题解及感悟_ctf crackme-CSDN博客

我这里简单描述自己的理解

这题进了 sub_401830 函数中,就会对密码进行加密操作,最后去对比

这个函数里面逆推,需要满足全部条件(里面也有反调试),得到v16为“dbappsec”

现在v16知道了,我们也可以知道byte_416050里面用到的key,可以通过调试知道是 0x2a,0xd7,0x92,0xe9,0x53,0xe2,0xc4,0xcd ,而且因为给了用户名welcomebeijing,所以byte_416050里面用到的固定是这几个数。

可以看到byte_416050最终给了ecx,所以我们只需要跟踪ecx即可

现在知道v16,byte_416050里用到的key,我们再异或以下就可以得到v15

在这里插入图片描述

借用别人的脚本,很简单

import hashlib
​
box = [0x2a, 0xd7, 0x92, 0xe9, 0x53, 0xe2, 0xc4, 0xcd]
s = "dbappsec"
​
secret = []
​
for i in range(len(s)):
    secret.append(hex(ord(s[i])^box[i]).replace("0x",''))
flag = ''.join(secret)
md = hashlib.md5()
md.update(flag.encode('utf-8'))
print ("flag{"+md.hexdigest()+"}")

flag{d2be2981b84f2a905669995873d6a36c}

  • 17
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值