BUU[SCTF2019]creakme

分析

收先查壳,32位无壳,放入对应的IDA中分析

image-20221030163047444

image-20221030163115377

首先看到第28行的函数直接进去看看

image-20221030163213705

是一个判断,还有一个退出调试,这里可能会涉及到反调试

这里看到了一个.SCTF,然后后面还有一个if的判断,这里可能回事SMC加密的遍历找区段名字

这里不太确定伪C具体想表达什么就去看了一下汇编代码

image-20221030164054700

发现这里有一部分完全不在伪C代码里头,然后去看看这里是干嘛的

image-20221030164145749

果然是反调试,然后看到后面的402424这里面娶了一个函数,点进去看看

image-20221030164532301

image-20221030164612096

发现这是一个加密函数,这里就能够完全确认是SMC加密了,这一部调用的是异或的这一部分(根据SMC加密的原理可以推导出,加密函数也自带解密功能)

然后去到第二个函数sub_4024A0这里去看看

image-20221030170021100

这里有反调试,进去404000中去看看这个返回值是什么

image-20221030170103285

发现是一大段的数据,而且这里的数据都是.SCTF段的,那么这个返回值就很有可能是异或部分的返回值了,然后这里用IDAPython来直接获取数据进行解密

脚本1

addstr = 0x404000 
addend = 0x405000
key = [0x73, 0x79, 0x63, 0x6C, 0x6F, 0x76, 0x65, 0x72, 0x73, 0x79, 0x63, 0x6C, 0x6F, 0x76, 0x65, 0x72,]
for i in range(addend-addstr):
ida_bytes.patch_byte(addstr+i,~(get_wide_byte(addstr+i)^key[i%len(key)]))

转换后的内容

image-20221030172518063

将这些按C进行转换,转换成汇编语言,然后声明一下就得到新的内容

image-20221030172639912

这里就是SMC的移位的加密部分(很明显这里应该就是简单的逐个-1然后逆序存储),解开差不多就出来了

脚本2

#include<stdio.h>
#include<string.h>
int main()
{
int a,i;
char b[]=">pvfqYc,4tTc2UxRmlJ,sB{Fh4Ck2:CFOb4ErhtIcoLo";
char c;
a=strlen(b);
for(i=0;i<a;++i)
{
--b[i];
}
for(int j=a-1;j>=0;j--) //由于数组是从0开始储存的,所以j=a-1
{
printf("%c",b[j]);
}
return 0;
}
//nKnbHsgqD3aNEB91jB3gEzAr+IklQwT1bSs3+bXpeuo=

这里很明显能知道是一个加密,但是不知道是什么加密,然后用IDA插件去看看是什么加密

image-20221030173858742

可以看到是AES加密,但是不晓得偏移量和密钥是什么,然后看到后面还有个base64,去定位一下

image-20221030173828082

猜测这里会是偏移量和密钥,然后去解密一下

image-20221030174259786

得到flag{Ae3_C8c_I28_pKcs79ad4}