Only Admin Can Take The Money!
题目
在你的帮助下,没有人进入了那个人的金库。然而。。。那个人的银行系统是分布式的,紫荆之巅只是中央控制台,偌大的金库就只有一个小小的控制台。这个控制台通过那个人的其中一个银行卡密码就可以访问他所有的银行账户,也就是用一个银行卡密码就可以使用所有的银行卡,汗。。。。。。那个人:“哈哈哈我太厉害了!又方便又安全!618赶紧买买买~”
HINT
UPX
解题报告
首先IDA
打开之后看到代码很有问题,尝试(官方提示upx
)用upx
的命令解压,得到未压缩的文件。
再用IDA
结合题目的提示,发现输入的用户名应该是admin
。
然后密码被几个md5
的函数作用了,可以猜测是输入md5
。
然后和正确的作比较,而题目提示密码是银行卡密码,也就是6位数字,那么可以爆破,不想爆破也可以用cmd5.com求解。
得到正确的密码后,发现要输入的flag是和密码进行简单的可逆的计算操作,那么可以由最终结果逆向求解出flag,逆向求解过程见参考代码。
#include <cstdio>
#include <cstdlib>
#include <cstring>
bool solu() {
int ans[] = {44, 123, 58, 98, 38, 89, 27, 47, 90, 9, 126, 37, 74, 122, 22, 69, 51, 3, 100, 5, 88, 57, 66, 25, 120, 76, 32, 73, 50, 7, 118};
unsigned char passwd[] = {'2', '0', '1', '7', '6', '4'};
int len = sizeof(ans) / sizeof(ans[0]);
int cnt = 0;
for (int i = 0; i < len; ++i) {
ans[i] ^= (passwd[cnt++] << 1);
cnt %= 6;
}
printf("%c", ans[0]);
for (int i = 1; i < len; ++i) {
for (int j = 0; j < i; ++j) {
ans[i] ^= ans[j];
}
printf("%c", char(ans[i]));
}
return true;
}
int main()
{
solu();
return 0;
}
Flag
HSCTF{N0w_u_c4n_t4ke_my_m0ney1}