实验吧CTF 转瞬即逝

转瞬即逝

尝试运行程序

文件是.rev1 所以放弃直接打开

IDA反汇编

rev1_IDA.png

IDA-F5 伪代码

f5.png

==先试试F5,若能得到伪代码,先观察伪代码。毕竟伪代码比汇编易懂些。==

1
2
3
4
5
6
7
8
9
10
11
strcpy(s, "tikp[luX|aoTjaoh");
v3 = strlen(s);
ptr = malloc(v3);
puts("Welcome!");
puts("This is a x64 REV,find out the flag.");
for ( i = 0; i < strlen(s); ++i )
{
ptr[i] = s[i] ^ i;
ptr[i] = 0;
}
printf("CTF{%s}\n", ptr);

在这道题中,可以发现题目是将s字符串”tikp[luX|aoTjaoh”中的字符的ascll码与其序号(从0开始)进行异或,再输出。

只是在输出前 进行了 ptr[i] = 0,将输出数组str内字符ascll置为0,导致输出了空字符。

因此可以尝试删掉这条语句,看看能否得出flag。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
#include<string.h>
int main ()
{
char s[]="tikp[luX|aoTjaoh",str[30];
memset(str,0,sizeof(str));
for(int i=0;i<strlen(s);i++)
{
str[i]=s[i]^i;
printf("%c",str[i]);
}
return 0;
}

运行结果如下

flag.png

得到flag this_is_the_flag。

对于简单逆向题,先尝试F5得到伪代码,若可以得到的话,伪代码更加易懂。
不过还能遇到这种题嘛~