您现在的位置是:首页 > 正文

BUUCTF CrackRTF

2024-04-01 01:09:26阅读 4

在这里插入图片描述

1.打开看看

下载下来发现是一个exe文件,那就先运行看看咯
在这里插入图片描述
显示要输入密码(1),随便输一个试试,结果程序直接退出了,既然有密码(1),推测还存在密码(2)

2.查壳

拖到exeinfope里边看看
在这里插入图片描述
显示是一个32位可执行文件,没有加壳,于是我们可以直接用ida进行下一步分析

3.静态分析

在这里插入图片描述
看到main函数,双击进去看看,接着又跳进了_main_0函数在这里插入图片描述
看上去有我们想要的东西,于是tab键切换到伪代码界面看看,看c还是比看汇编要直观高效
在这里插入图片描述
一段一段的解读代码吧
在这里插入图片描述
两个memset操作,给pbData和String1初始化一段内存空间,初始化v4,把输进去的值给pbData。
在这里插入图片描述
判断输进去的密码(1)pbData的长度,不为0就退出程序,为0继续往下执行,atoi函数将pbData这个字符串转换为integer整型赋给v4,v4小于10000的话就退出程序,根据atoi函数的特性,如果想要v4>100000的话,那肯定pbData的前6的字符都为数字且这6位数字>100000,前面又要求pbData的长度为6,那么就可以判断pbData就是由6个数字组成的字符串,范围是100000到999999。
在这里插入图片描述

把“@DBApp”接在pbData后边,再计算pbData的长度,接着进入sub_40100A函数,进去看看
在这里插入图片描述
刚看到的时候是懵的,以为是啥底层函数,但是仔细看发现每个函数都有“Crypt”字样,应该和密码学相关。
在这里插入图片描述

简而言之,CryptoAcquireContextA函数用于得到一个句柄phProv,CryptCreateHash函数规定哈希加密的方式,0x8004表示sha1加密,CryptHashData函数中pbData是要加密的数据,dwDataLen是数据的长度,CryptGetHashParam函数将哈希值传入v6,长度传给pdwDataLen。
在这里插入图片描述
v6格式化打印给String2,再把String2的值接到lpString1也就是实参String1后边,由于String1是一个空字符串,所以这里相当于把String2赋给String1。
然后就是一些销毁指针的一些操作,就不做具体分析了。
回到main函数
在这里插入图片描述
比较String1和一个很长的字符串,那么只要String1和这个哈希值相等,就证明我们输入的密码1正确,就可以进入下一个密码(2)的验证流程了,这里可以用python爆破一下输入的密码1
在这里插入图片描述
得到密码为123321,跑一下程序验证一下在这里插入图片描述
没毛病!!!接着往下

在这里插入图片描述
流程感觉和第一个密码的流程差不多欸,也是输入了6个字符,然后把之前的pbData拼接到String后边,于是String = “xxxxxx123321@DBApp”
接着进入sub_401019这个函数
在这里插入图片描述
还是一个哈希加密函数,但是这回他用的是0x8003也就是md5加密,好像貌似可以爆破?但问题是输入的这6个字符无法确定是啥,不可能把所有的可打印字符组合都尝试一遍吧,就算是字母加数字的组合,花上很长时间都不一定爆破得出。这里出题人应该就是不想让我们去考虑爆破这个方法,应该还有别的点可以突破。接着往下看
在这里插入图片描述
在哈希值验证相同了之后,程序又进入了一个sub_40100F函数,而参数String正是我们前面说的String = “xxxxxx123321@DBApp”
说不定这就是突破口?进去看看在这里插入图片描述
FindResourceA函数,用于返回指定资源类型整数标识符和资源的整数标识符所对应的句柄,SizeofResource函数得到句柄对应的资源文件的大小,LoadResource函数得到指向资源文件第一个字节的句柄,LockResource函数返回指向对应资源文件第一个字节的指针。这里稍稍提一下资源文件,PE格式文件里边报考pe文件头,代码节,资源节等等,这些个函数就是为了找到并打开某个资源文件,指向它的第一个字节,以便对他进行操作,为了直观的看到这个资源文件,我们需要用到Resource hacker这个软件,打开后可以发现
在这里插入图片描述
AAA资源类型下的101文件也即是0x65文件,接着往下看
在这里插入图片描述
进入sub_401005函数看看
在这里插入图片描述
v5得到lpString也就是实参String = "xxxxxx123321@DBApp"的长度
在这里插入图片描述
a2[i] ^= lpString[i % v5]
算法很简单,把a2[i] 异或lpString[i % v5]的值传回给a2[i],而a2是lpBuffer也就是指向资源文件第一个字节的指针。接着往下看
在这里插入图片描述CreateFileA函数在该程序的相对目录下创建一个dbapp.rtf文件,接着WriteFile函数把lpBuffer字符串的内容写入这个文件。也就是说把刚刚异或的结果写入这个文件,密码 ^ 资源文件 = rtf文件 ,如果我们能得到rtf文件的数据,再用rtf文件 ^ 资源文件 = 密码 ^ 资源文件 ^ 资源文件 = 密码。相同类型文件的内容是不同的,但是每个文件都有对应的文件头,文件头是不变的,那我们只要知道rtf文件头是啥,只要这个文件头是大于或等于6个字节,那我们至少就能得到密码的前6个字节了。上网搜搜rtf文件头

放到010里
在这里插入图片描述
只有5位…太抽象了,到自己的电脑里搜搜rtf后缀的文件吧
在这里插入图片描述
找到了一堆,我看了好几个,开头6位都是{\rtf1
在这里插入图片描述
知道了rtf文件头,就可以写脚本异或反推密码咯
在这里插入图片描述
得到密码是~!3a@0
运行一下程序试试
在这里插入图片描述
运行完后直接退出了,啥也没显示,回想起创建在相对目录下的dbapp.rtf文件,打开看看在这里插入图片描述
在这里插入图片描述
里边放着flag{N0_M0re_Free_Bugs}

4.总结

这道题考察的知识点挺多挺杂的,对windows api的了解和掌握程度,对杂凑函数的熟悉程度,对文件打开关闭函数的掌握程度,当然,还有python写脚本的能力。是一道很经典的题

网站文章

  • 禁用Chrome的“请停用以开发者模式运行的扩展程序”提示。【已更新V80最新方法】

    禁用Chrome的“请停用以开发者模式运行的扩展程序”提示。【已更新V80最新方法】

    解决方法网上搜索了一圈,发现主要有3种方法:组策略法,运行批处理法,直接改dll文件法。第一种组策略的据说很早就失效了,我亲测了一下确实没用。另外一个批处理的方法据说也失效了,而且批处理权限太大没敢尝试运行。2019.12.19 解决老版本dll在79版本会引起崩溃方法有效的话点个赞让更多人看到吧在Chrome.exe文件夹下添加dll文件法(亲测如图)dll文件地址...

    2024-04-01 01:09:15
  • Python实现字符串模糊匹配

    Python实现字符串模糊匹配

    在一个字符串中,有时需对其中某些内容进行模糊匹配以实现条件的判定,如在“你好,hello,world”中判断是否含有“llo”。Python中通过re.search()方法实现,特别地,对于首位起始的内容匹配,也可通过re.match()方法实现。若匹配成功,它们返回一个re.Match对象;若匹配失败,返回None。

    2024-04-01 01:08:58
  • 换电脑需要装那些东西呢

    这里列出一个清单 phpstorm 2020.1及以上版本 navicate 12及以上版本 wamp 3.2及以上版本 #遇到问题 wamp apache 无法正常启动 进入到apache bin目...

    2024-04-01 01:08:30
  • windows server 2008 搭建DNS服务器

    windows server 2008 搭建DNS服务器

    文章目录windows server 搭建DNS服务器0. 环境声明1. 设置静态IP2. 安装DNS服务器3. 配置DNS服务器 windows server 搭建DNS服务器 0. 环境声明 本次...

    2024-04-01 01:08:23
  • 2020 中国软件企业 100 强,腾讯第二、阿里第三,第一竟然是他!

    2020 中国软件企业 100 强,腾讯第二、阿里第三,第一竟然是他!

    点击上方,选择星标,每天给你送干货!来自:中国电子信息行业联合会 前言中国电子信息行业联合会为贯彻落实党中央、国务院“关于培育具有全球竞争力的世界一流企业、具有创新能力的排头兵企业、发...

    2024-04-01 01:08:16
  • 【云计算】实验5:Nova配置(计算节点)

    【云计算】实验5:Nova配置(计算节点)

    云计算实验:Nova配置(计算节点)

    2024-04-01 01:07:49
  • memcpy函数优化及DMA对比

    memcpy函数优化及DMA对比

    优化算法结构,提高芯片的使用效率,挖掘芯片的潜在能力,对提高产品质量,降低产品成本有着重要意义,在性能受限的嵌入式设备更加重要。

    2024-04-01 01:07:42
  • Java进阶——工厂模式

    Java进阶——工厂模式

    工厂模式是创建型模式最基础,最重要的一种设计模式工厂模式用于隐藏创建对象的细节工厂模式的核心是:工厂类(Factory)简单工厂,工厂方法与抽象工厂。

    2024-04-01 01:07:35
  • minikube安装kubernetes(Centos7)【图文】

    minikube安装kubernetes(Centos7)【图文】

    k8s有很多种安装方式minikube允许使用mac、linux、windows快速创建一个k8s集群;也可以使用kubeadm方式基于二进制快速安装一个集群;但是需要在生产环境执行的k8s集群需要使...

    2024-04-01 01:07:26
  • SpringMVC 之validator验证笔记(五)

    SpringMVC支持的数据校验是JSR303的标准,通过在bean的属性上打上annotation @NotNull @Max等进行验证。JSR303提供有很多annotation借口,而SpringMVC对于这些验证是使用hibernate的实现,所以我们需要添加hibernate的一个validator包: org.hibernate hibernate-valid

    2024-04-01 01:06:56