第一题easyre
打开题目后发现有一个压缩文件,点击下载。
解压之后发现是一个exe文件,优先考虑导入IDA。
按shift+F12搜索关键字符串
可以看到第一个字符串即为正确答案。
第二题reverse1
与上题一样,将文件导入IDA
检索字符串(按Ctrl+F搜索关键字符串“flag”)
结果并没有直接显示flag,考虑伪代码
按F5查看伪代码
int __cdecl main_0(int argc, const char **argv, const char **envp)
{
char *v3; // rdi
__int64 i; // rcx
size_t v5; // rax
char v7; // [rsp+0h] [rbp-20h] BYREF
int j; // [rsp+24h] [rbp+4h]
char Str1[224]; // [rsp+48h] [rbp+28h] BYREF
__int64 v10; // [rsp+128h] [rbp+108h]
v3 = &v7;
for ( i = 82i64; i; --i )
{
*(_DWORD *)v3 = -858993460;
v3 += 4;
}
for ( j = 0; ; ++j )
{
v10 = j;
if ( j > j_strlen(Str2) )
break;
if ( Str2[j] == 111 )
Str2[j] = 48;
}
sub_1400111D1("input the flag:");
sub_14001128F("%20s", Str1);
v5 = j_strlen(Str2);
if ( !strncmp(Str1, Str2, v5) )
sub_1400111D1("this is the right flag!\n");
else
sub_1400111D1("wrong flag\n");
return 0;
}
str2本身是被赋值的,双击str2进入反汇编界面查看str2的值
其中函数
for ( j = 0; ; ++j )
{
v10 = j;
if ( j > j_strlen(Str2) )
break;
if ( Str2[j] == 111 )
Str2[j] = 48;
}
为处理str2的部分,可以推断出111和48为AscII码值,按r键可以将其转化为字符串。
这里能判断出这串代码的意思是吧str2中的o全部换为0,str2为{hello_world}
所以正确的flag为flag{hell0_w0rld}。
第三题reverse2
这个题的文件下载下来没有后缀,可以用exeinfope查看一下
这种文件可能是LINUX程序
用IDA打开
检索字符串
查看伪代码
这里的关键代码是把flag里面的i或r换成1,双击查看flag的值
flag是db和一个{(db的值在下面,flag其实就是{hacking_for_fun})
然后按照代码修改flag,可以得到真正的flag为flag{hack1ng_fo1_fun}。