CrackRTF(Hash类型判断)
(1)
将文件用IDA打开,找到主函数并进行分析
对于Destination和Str第一次的加密是如何看出来的呢?首先查看sub_40100A和sub_401019函数
下图是sub_40100A
下图是sub_401019
通过上面两张图中红色框框起来的函数部分我们可以判断加密类型
介绍一下CryptCreateHash 函数
CryptCreateHash 函数
语法
1 | BOOL CryptCreateHash( |
参数
1 | [in] hProv |
通过调用 CryptAcquireContext 创建的 CSP 的句柄。
1 | [in] Algid |
标识要使用的哈希算法 的ALG_ID 值。
此参数的有效值因使用的 CSP 而异。 有关默认算法的列表,请参阅备注。
1 | [in] hKey |
如果哈希算法的类型是键控哈希,例如 基于哈希的消息身份验证代码 (HMAC) 或 消息身份验证代码 (MAC) 算法,则哈希的密钥在此参数中传递。 对于非密钥算法,此参数必须设置为零。
对于键式算法,该密钥必须是 具有密码块 链接 (CBC) 的密码 模式 的 块 加密密钥,例如 RC2。
1 | [in] dwFlags |
定义了以下标志值。
注:通过上述了解可以知道,Aligid的值决定了函数的加密类型,默认算法表查看ALG_ID (Wincrypt.h) - Win32 apps | Microsoft Learn
(2)
通过查看算法表,我们可以知道sub_40100A是进行了sha1加密,sub_401019是进行了MD5加密
sha1的解密脚本如下
得到密码1:123321
对于爆破脚本的分析:
str()
将参数转换成字符串类型
1 | age=20 |
在Python看来,age这个变量表示的可能是数值20,也可能是字符2和0。因为 “+” 运算符两边的数据需要类型一致,因此像上面这样在字符串中使用整数时,需要显式地将这个整数用作字符串,让其与两侧的字符串数据类型保持一致。即调用 str() 函数:
1 | age=20 |
hexdigest()
它可以计算给定数据的摘要值,以16进制字符串的形式返回。
1 | import hashlib |
(3)
程序中并没有说明密码2的范围,所以不能爆破,所以我们继续往下分析程序
有一个函数sub_40100F
,点进去看一看
1 | HRSRC FindResourceA( |
1 | SizeofResource表示该函数返回指定资源的字节数大小。 |
1 | LoadResource function |
总之这三个函数,一个找句柄,一个通过句柄找指针,一个范围查找的资源的大小
1 | hResInfo = FindResourceA(0, (LPCSTR)'e', "AAA"); |
这一段代码的含义就是,从AAA文件中查找字符,然后如果没有找到就返回,找到了的话就计算出资源的大小,把资源第一个字符出的指针传给lpBuffer
(4)
继续往下看代码
1 | sub_401005(lpString, (int)lpBuffer, nNumberOfBytesToWrite); |
又碰到一个函数sub_401005
资源的每一位和密码的每一位循环异或
异或结束之后,生成一个rtf文件
我们的密码一共是18位
我们现在想要的是前六位的密码,循环异或的话,那么也就是说,资源的前六位与密码的前六位异或的结果就是rtf文件的前六位
我们找来一个rtf文件(直接在桌面生成一个rtf文件,随便输入一些内容,用010editor打开即可查看头文件),看看它的标志位
前六位是{\rtf1
用resourcehacker打开文件,查看资源
看一下资源的前六位,写出异或脚本
1 | rtf = '{\\rtf1' \\需要注意,\r需要转义,变成\\r |
结果为~!3a@0
接下来就可以继续输入第二段密码了
两端密码输入完后,就会在程序所在文件夹中生成一个带有flag的rtf文件,打开就能得到flag
flag为Flag{N0_M0re_Free_Bugs}
BABYRE(IDApython)
查看主函数
分析伪代码,我们可以看出if语句中的judge()是一个函数,但是从前面可以看出judge是一个数组,进行了异或。
点击judge,进行数据查看
选中public judge,按C键将数据解析为代码。
选中红色部分,按P
无法解析代码,出现这个问题的原因是代码混淆
代码混淆——函数经过代码混淆或加密,使得静态分析工具无法正确解析函数的逻辑和结构
一、IDApython
这里的judge函数被加密了,插入脚本进行解密
提示:先退出程序重新来输入解密脚本
(1)在File中找到Script command
(2)输入解密脚本
1 | 1、#include<idc.idc>:包含IDA Pro SDK头文件,其中包含IDA Pro API和数据结构的声明。 |
高版本的idapython解密脚本
(3)运行解密脚本
(4)选中public judge,按C键
(5)选中红色部分,按P键
(6)写出解密脚本
二、Remote Linux debugger
(1)设置好断点,调试器准备好后开始调试,按F9运行
(2)在linux中随意输入flag(注意:flag长度为14)让程序断下
(3)F7单步步入下图所示的call
(4)发现14个mov,这是在声明一个数组,这些数就是密文
(5)继续分析,发现流程
1 | cmp dword ptr [rbp-4], 0Dh |
就是比较[rbp-4]和0Dh(十进制:13),小于等于13则跳转,其实就是做了14次判断,分析图如下:
(6)分析跳转后的汇编代码
1 | .data:0000000000600B49 loc_600B49: ; CODE XREF: .data:0000000000600B75↓j |
(7)写出解题代码
1 | a=[0x66,0x6D,0x63,0x64,0x7F,0x6B,0x37,0x64,0x3B,0x56,0x60,0x3B,0x6E,0x70] |
即可求出flag
Youngter-drive
多线程+下标查找字符串
解题代码
1 | source='TOiZiZtOrYaToUwPnToBsOaOapsyS' |
BUUCTF逆向题Youngter-drive_youngter-drive题解-CSDN博客
Buuctf Younger-drive 题解_younger-driver-CSDN博客
相册(jadx的使用&apk)
[BUUCTF——相册_buuctf 相册-CSDN博客](https://blog.csdn.net/qq_64558075/article/details/121735028?ops_request_misc=&request_id=&biz_id=102&utm_term=buu 相册1&utm_medium=distribute.pc_search_result.none-task-blog-2blogsobaiduweb~default-6-121735028.nonecase&spm=1018.2226.3001.4450)
[buu逆向刷题(三)_shidword-CSDN博客](https://blog.csdn.net/weixin_45055269/article/details/108814610?ops_request_misc=%7B%22request%5Fid%22%3A%22171479244216800225565194%22%2C%22scm%22%3A%2220140713.130102334.pc%5Fblog.%22%7D&request_id=171479244216800225565194&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-10-108814610-null-null.nonecase&utm_term=buu 相册1&spm=1018.2226.3001.4450)