1.open-source
拿到题目,发现这是一段C语言代码。
此处,我用devc打开,得到如下的几个主函数。
从中可以发现,这是要我们改变first,second,argv[3]才能得到正确的flag。
开始分析第一个first,这里发现if语句,如果括号中的条件成立,那么就将输出"you are wrong",并直接退出,我们考虑把first直接改成oxcafe(提示你该喝咖啡了)对应的十进制数:51,966。
接下来是second,同样的方法,使if成立的条件,我偏就改成使其不成立的;很简单的,second=25时就能使if不成立。
最后是argv[3],直接把字符串复制下来就行;然后编写一段新的程序。
int main(){
unsigned int hash = 51966 * 31337 + (25 % 17) * 11 + strlen("h4cky0u") - 1615810207;
printf("Get your key: ");
printf("%x\n", hash);
return 0;
}
跑一跑程序,就能获得flag
2.insanity
直接将其保存到本地,然后拖入IDA,试试shift+f12查找字符串,惊讶的发现,flag就在其中。
3.python-trade
保存附件到本地,发现得到一下pyc文件,那么pyc文件是什么呢?
pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由python的虚拟机来执行的,这个是类似于JAVA或者.NET的虚拟机的概念。pyc的内容,是跟python的版本相关的,不同版本编译后的pyc文件是不同的,2.5编译的pyc文件,2.4版本的 python是无法执行的。
我打开了在线反编译的网页,将pyc文件转为py文件,我们就可以正常打开了,即使反编译无法完整的还原代码,但是这是目前能想到的唯一办法。
反编译得到的代码如上,然后开始分析代码。发现第3行开始的encode函数是主要的改变用户输入的flag的处理函数,处理后将其与create比较,全部正确则输出correct。
现在利用correct里面的字符串进行逆向,找出flag,书写如下脚本:
得到flag:nctf{d3c0mpil1n9_PyC}
4.getit
直接用ida打开给出的文件,32位不行就上64位!F5反编译一下得到代码。
分析代码。找到s和t的对应的值
用s和t对应的值进行编译,我们可以模拟输出:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#pragma warning(disable:4996)
int main(void)
{
__int64 v5;
char v3;
char s[] = "c61b68366edeb7bdce3c6820314b7498";
char t[] = "SharifCTF{????????????????????????????????}";
v5 = 0;
while(v5 < strlen(s))
{
if(v5 & 1)
{
v3 = 1;
}else
{
v3 = -1;
}
*(t+v5+10) = s[v5]+v3;
v5 += 1;
}
printf("%s",t);
system("PAUSE");
return 0;
}
跑一跑得到字符串,试试发现它就是flag。
SharifCTF{b70c59275fcfa8aebf2d5911223c6589}