[BUUCTF-Reverse2]
1.下载下来发现不是exe文件,放进Exeinfo PE中查看信息
百度了一下elf文件是什么,不懂,先扔IDA里面试试。
2.放入IDA,发现有main函数,进去,flag一般都在main函数中。
一眼就能看见关键信息,跟进F5。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| int __cdecl main(int argc, const char **argv, const char **envp) { int result; int stat_loc; int i; __pid_t pid; char s2; unsigned __int64 v8;
v8 = __readfsqword(0x28u); pid = fork(); if ( pid ) { argv = (const char **)&stat_loc; waitpid(pid, &stat_loc, 0); } else { for ( i = 0; i <= strlen(&flag); ++i ) { if ( *(&flag + i) == 105 || *(&flag + i) == 114 ) *(&flag + i) = 49; } } printf("input the flag:", argv); __isoc99_scanf("%20s", &s2); if ( !strcmp(&flag, &s2) ) result = puts("this is the right flag!"); else result = puts("wrong flag!"); return result; }
|
可以看出,比较输入值r2与flag是否符合。
跟进字符串flag
可见flag是 {hacking_for_fun}
老套路,这个flag也是要被处理一遍的。
Ascii码按R提前转换过了
代码的含义就是,遍历每一个字母,把i和r换成1。
所以真正的flag是flag{hack1ng_fo1_fun}
思考:看不懂*(&flag+i)是什么意思,又有点似懂非懂,忘记c语言的指针了。呜呜呜。