2020-10-07

逆向练习#2

[BUUCTF-Reverse2]

1.下载下来发现不是exe文件,放进Exeinfo PE中查看信息

image-20201006175641359

百度了一下elf文件是什么,不懂,先扔IDA里面试试。

2.放入IDA,发现有main函数,进去,flag一般都在main函数中。

image-20201006175920561

一眼就能看见关键信息,跟进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; // eax
int stat_loc; // [rsp+4h] [rbp-3Ch]
int i; // [rsp+8h] [rbp-38h]
__pid_t pid; // [rsp+Ch] [rbp-34h]
char s2; // [rsp+10h] [rbp-30h]
unsigned __int64 v8; // [rsp+28h] [rbp-18h]

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

image-20201006180258640

可见flag是 {hacking_for_fun}

老套路,这个flag也是要被处理一遍的。

image-20201006180421718

Ascii码按R提前转换过了

代码的含义就是,遍历每一个字母,把i和r换成1。

所以真正的flag是flag{hack1ng_fo1_fun}

思考:看不懂*(&flag+i)是什么意思,又有点似懂非懂,忘记c语言的指针了。呜呜呜。