攻防世界逆向-open source

攻防世界逆向-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
攻防世界的题还是比较随意的,我喜欢!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值