BUUCTF刷题
crackRTF
是一个资源题,以前没见过,记录一下。
反编译一下:
|
|
第一个密码是一个小于100000的数字,数字后面加上@DBApp后求哈希值,求哈希值的函数如下:
|
|
CryptCreateHash函数的第二个参数用来确定哈希函数的类型
0x8004 -> SHA1, 0x800c -> SHA256, 0x8003 -> MD5
所以第一个密码是爆破SHA1,爆破范围是0-100000,爆破结果是123321
第二个输入是6字节的字符串,然后求MD5,我一开始的想法是爆破后来才知道超过4字节爆破是在想peach
继续往下走,在sub_40100F函数中调用了sub_4014D0
|
|
FindResourceA(0, (LPCSTR)0x65, “AAA”)函数用于寻找名称为AAA的资源文件,下面是关于windows中资源文件的的一些资料.
VC使用自定义资源,FindResource,LoadResource,UnLockResource
Windows MFC工程起步
使用ResourceHacker可以查找文件中的resource:
看到资源AAA中是一系列的字符串
sub_401005中将AAA中的字节与输入的6字节字符串进行异或,最终将结果写入dbapp.rtf中,用写字板随便写一个文件然后查看RTF文件格式
取前6个与AAA中的字符串异或就能得到passwd2
babyre
是SCTF2019的一道RE题,当时没做出来看了师傅的WP后明白了,后来看到Ex大佬的WP感觉大佬的做法好特别,记录一下。
首先是调试:因为前面有花指令无法F5只有看汇编+调试.文件是动态加载的, 无法确定断点位置, 我之前没调过这种, 查资料发现了attach的方法. 先运行可执行文件, 然后使用ps -aux | grep filename
的方法查看进程号, 使用sudo gdb filename
的方法运行gdb, 然后使用attach PID
附加进程. 如果程序停留在库函数中可以使用finish
命令快速跳过.
还有一些实用的指令:
|
|
一共有三关, 第一关是一个三维迷宫
第二关输入经过特定表表转换之后,不断左移累加,最终的转换结果需要与字符串“sctf_9102”相等
调试发现是一个4字节到3字节的转换关系, 进行爆破.
一般的爆破流程:
|
|
Ex大佬直接利用源程序里的流程进行爆破, 我觉得这样可以并不清楚具体实现细节,出错的概率也更小.具体的映射细节在loc_C22中:
|
|
运行:
|
|
主要关键在于LD_PRELOAD, 找到一篇介绍文章如下:
https://www.cnblogs.com/net66/p/5609026.html
说明在babygame最开始调用_init函数的时候其实会调用hook.c中的_init函数, _init是一个爆破的函数,调用func时会调用loc_C22
还有关于dlopen()函数的问题
https://www.cnblogs.com/youxin/p/5109520.html
第三问是一个可逆函数。
|
|
输入分别分位4个32bit的整数,赋值给array[0]-array[3],然后根据异或变换和f(x)转换得到array[30],最后四个字节分别为0xD8BF92EF,0x9FCC401F,0xC5AF7647,0xBE040680
f(x)函数依赖于x。所以直接将公式倒置即可。
|
|
运行实例:
|
|
creakme
在main函数中,首先进行了一些预处理。sub_402320添加了SEH
添加SEH的基本步骤
在上图中1步骤之前和步骤2之后的SEH链分别如下:
安装完SEH后通过call ds:DebugBreak
调用DebugBreak函数进入SEH, 在调试过程中发生中断会优先交给调试器处理,需要在SEH函数开始下断点后用Shift + F9
运行才可以在SEH函数处暂停.
SEH函数如下:
最终会调用0x4023EF函数,这个函数首先使用call ds:CheckRemoteDebuggerPresent
和call ds:IsDebuggerPresent
来检查程序是否被调试, 如果没有调试则进入sub_402450函数,这个函数会将0x404000后的0x200个字节与sycloversyclover进行异或
|
|
sub_4024A0首先使用__readfsdword(0x30u)检查程序是否被调试,然后调用404000函数,SMC后404000成了一个函数,用于修改最后的对比字符串。
最后在sub_4020D0中,对输入进行AES_CBC_128加密。密钥为’sycloversyclover’,IV为’sctfsctfsctfsctf’。这里的AES流程并不是正常的算法流程,这里使用了查表法,对比查表参数可以看出来是AES.
关于AES查表法的识别有下面的文章可以参考
逆向分析及识别恶意代码中的AES算法
BJDCTF_easy
下面代码中v2中用来存储v14转化为二进制的数值,v2[0]存储v14的最高位
|
|
#define SHIDWORD(x) (*((int32*)&(x)+1))
取变量X地址的下一个字节的地址并且解引用,最后得到的是地址中的值,通俗点讲就是X所在内存中的邻居