32位,ida打开
f5,先不管呢
winmain函数
看看字符串
进到flag那里,没法反编译
寻找
看汇编,发现两个一样的push(不理解怎么找到的,毕竟好多好多代码)
应该是花指令
Nop掉第二个,然后p,f5,
直接右键Nop不知道和下图有啥区别,应该问题不大吧
分析发现,一共两个主要函数
先进入1005函数
写个脚本
cpp
#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
运行即可
cpp
#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}