本文主要是介绍buuctf re findKey,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
参考:http://t.csdnimg.cn/hUKRJ
参考:http://t.csdnimg.cn/kIk4i
32位,ida打开
f5,先不管呢
winmain函数
看看字符串
进到flag那里,没法反编译
寻找
看汇编,发现两个一样的push(不理解怎么找到的,毕竟好多好多代码)
应该是花指令
Nop掉第二个,然后p,f5,
直接右键Nop不知道和下图有啥区别,应该问题不大吧
分析发现,一共两个主要函数
先进入1005函数
写个脚本
#include<stdio.h>
int main()
{int i,j,v5=2,a3=32,result;char a1[]="SS";char a2[]="0kk`d1a`55k222k2a776jbfgd`06cjjb";for(i = 0; ; ++i ){result = i;if ( i >= a3 )break;*(i + a2) ^= a1[i %2];}puts(a2);return 0;
}
运行得到
提交发现错误,再分析另一个函数
哈希标识符:ALG_ID (Wincrypt.h) - Win32 apps | Microsoft Learn
函数介绍:(全都是英文,看不懂QAQ)
CryptCreateHash function (wincrypt.h) - Win32 apps | Microsoft Learn
具体参考:http://t.csdnimg.cn/rd5mJ
CryptCreateHash 函数的参数包括:
hProv:加密服务提供者的句柄。
Algid:指定要使用的哈希算法的 ALG_ID 值。
hKey:如果哈希算法是带密钥的,则传入密钥的句柄;否则为0。
dwFlags:标志位,通常为0。
phHash:指向新创建的哈希对象句柄的指针。
CryptHashData 函数的参数包括:
hHash:哈希对象的句柄。
pbData:指向要进行哈希处理的数据的指针。
dwDataLen:要进行哈希处理的数据的长度。
dwFlags:标志位,通常为0。
CryptGetHashParam 函数的参数包括:
hHash:哈希对象的句柄。
dwParam:指定要获取的哈希参数。
pbData:指向存储参数数据的缓冲区的指针。
pdwDataLen:指向存储参数数据长度的变量的指针。
dwFlags:标志位,通常为0。
MD5解密网站:MD5在线加密/解密/破解—MD5在线 (sojson.com)
然后就是两种不同方法:
方法一动态调试--有待学习
把string1改成123321
运行所给程序
方法二:继续分析函数
下面还有一个函数,和上面那个异或的是一个函数
第一个-492没有找到对应的字符串,所以推测是刚刚得到的123321,要不然前面也没啥用了
后面那个字符串,数据没办法一次全部导出来,也可能我打开方式不对,就一个个敲得,刚刚把5B写成58了,导致i变成j了,服了QAQ
运行即可
#include<stdio.h>
int main()
{int i,j,v5=6,a3=19;char a1[]="123321";char a2[]={0x57,0x5E,0x52,0x54,0x49,0x5F,0x1,0x6D,0x69,0x46,0x2,0x6E,0x5F,0x2,0x6C,0x57,0x5B,0x54,0x4C};for(i = 0; ;i++){if(i>=a3)break;*(i+a2)^= a1[i%6];}puts(a2);return 0;
}
flag{n0_Zu0_n0_die}
这篇关于buuctf re findKey的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!