攻防世界逆向-open source
是个C文件,所以放进devc++看一看。
点击这里的compile就可以编译,然后他说我有什么错,我也不会调试。
还是刚才那个execute,点击run,就可以出现这个黑色的框框,按任意键程序就退出了。
exit(0)表示程序正常, exit(1)/exit(-1)表示程序异常退出,exit(2)表示表示系统找不到指定的文件。用Error lookup可以查看~~~
exit()结束当前进程/当前程序/,在整个程序中,只要调用exit就结束(当前进程或者在main时候为整个程序)
return()是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了,如果不是,那就是退回上一层调用。在多个进程时.如果有时要检测上进程是否正常退出的.就要用到上个进程的返回值,依次类推。
exit(1)表示进程非正常退出. 返回1;
exit(0)表示进程正常退出. 返回0.
进程环境与进程控制(1): 进程的开始与终止
exit(int n)其实就是直接退出程序,因为默认的标准程序入口为 int main(int argc, char** argv),返回值是int型的。一般在shell下面,运行一个程序,然后使用命令echo $?就能得到该程序的返回值,也就是退出值,在main()里面,你可以用return n,也能够直接用exit(n)来做。unix默认的习惯正确退出是返回0,错误返回非0。
理论上exit可以返回小于256的任何整数。返回的不同数值主要是给调用者作不同处理的。
unsigned int hash = first * 31337 + (second % 17) * 11 + strlen(argv[3]) - 1615810207;
printf("Get your key: ");
printf("%x\n", hash);
所以我们只需要找到hash的值就能找到flag。第一行描述了hash的值,就是需要算很多的数,所以用python写一个脚本。
这里下面有红色波浪线是因为python不知道那个first、second、argv是什么,所以我们需要逐一找出这些变量的表现形式。
strlen是C里面的函数,求字符串长度的,在python里面是len这个函数。
这样下面的红波浪就消失了。
if (first != 0xcafe) {
printf("you are wrong, sorry.\n");
exit(2);
}
这段代码的意思是假如first不等于0xcafe的时候输出you are wrong 。说明first是等于这个的。
恭喜!获得了一个变量first的值。
if (second % 5 == 3 || second % 17 != 8) {
printf("ha, you won't get it!\n");
exit(3);
}
这段代码的意思是如果second取模5余3或者模17不余8,就输出ha, you won’t get it。
那么我们不想让他输出这条讨厌的语句并且结束,所以我们就不能让那个条件成立,由此改写成
second % 5 !== 3 && second % 17 = 8
先看第一条,second % 5 !== 3
second不能取3、8、13、18.。。。
再看第二条 second % 17 = 8
second可以取8、25.。。。
由于second必须要同时满足这俩条件,所以second可以取25,赋值。
恭喜你得到第二个变量的值!
if (strcmp("h4cky0u", argv[3])) {
printf("so close, dude!\n");
exit(4);
}
这个函数的意思之前提过,假如这俩数不相等,就会执行so close, dude!并且退出,所以argv=这个字符串。
恭喜你得到了第三个变量的值!
尝试输出,得到了上面的值。
printf("%x\n", hash);
我们发现在C源码中,是这样的输出形式,就是以十六进制输出。
那么在python中也可以用十六进制输出看看。
然后就得到了一串十六进制的数字。
万万没想到,这个居然就是flag。
不过不能带前面的0x
flag是c0ffee
攻防世界的题还是比较随意的,我喜欢!