open-source
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
if (argc != 4) {
printf("what?\n");
exit(1);
}
unsigned int first = atoi(argv[1]);
if (first != 0xcafe) {
printf("you are wrong, sorry.\n");
exit(2);
}
unsigned int second = atoi(argv[2]);
if (second % 5 == 3 || second % 17 != 8) {
printf("ha, you won't get it!\n");
exit(3);
}
if (strcmp("h4cky0u", argv[3])) {
printf("so close, dude!\n");
exit(4);
}
printf("Brr wrrr grr\n");
unsigned int hash = first * 31337 + (second % 17) * 11 + strlen(argv[3]) - 1615810207;
printf("Get your key: ");
printf("%x\n", hash);
return 0;
}
一段C语言代码进行分析
first 如果first不等于0xcafe 就退出 那 first=0xcafe 换成10进制就是first=0xcafe
second 写一段代码试一下 second 满足条件就退出 那看一下不满足的
第一个 25
second=25; 先试试
if (strcmp("h4cky0u", argv[3])) 如果if成立则退出 那么应该让if不成立
strcmp函数作用 如果两个值相同则返回0所以 argv[3]=h4ckyu
然后写代码得出答案
logmein
查壳得知无壳并且是64位的
用ida打开 找到main函数 F5转换成伪代码
分析一下 sub_4007c0()
错误
表示的意思是 如果输入的字符和经过处理v7 v8的值相同 则密码正确 写解密脚本
因为在存储的时候是采用 小端序 所以 v7的值要倒过来
解出