版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35396598/article/details/86761189
https://ctf.bugku.com/challenges#love
首先是下载文件
程序的流程大体就是输入,然后比较。
所以首先用IDA打开程序,
使用 shift +F12 查看 有哪些字符串
看到有一个 enter the flag
那就是程序的入口吧,所以双击这个 字符串,然后
使用X , 查看地址
使用F5进行反编译
int sub_F756E0()
{
size_t v0; // eax@6
const char *v1; // eax@6
size_t v2; // eax@9
char v4; // [sp+0h] [bp-188h]@6
char v5; // [sp+Ch] [bp-17Ch]@1
size_t v6; // [sp+10h] [bp-178h]@3
size_t j; // [sp+DCh] [bp-ACh]@6
size_t i; // [sp+E8h] [bp-A0h]@1
char Dest[108]; // [sp+F4h] [bp-94h]@5
char Str; // [sp+160h] [bp-28h]@6
char v11; // [sp+17Ch] [bp-Ch]@6
unsigned int v12; // [sp+184h] [bp-4h]@1
int savedregs; // [sp+188h] [bp+0h]@1
memset(&v5, 0xCCu, 0x17Cu);
v12 = (unsigned int)&savedregs ^ __security_cookie;
for ( i = 0; (signed int)i < 100; ++i )
{
v6 = i;
if ( i >= 0x64 )
sub_F71154();
Dest[v6] = 0;
}
sub_F7132F("please enter the flag:", v4);
sub_F71375("%20s", &Str);
v0 = j_strlen(&Str);
v1 = (const char *)sub_F710BE(&Str, v0, &v11);
strncpy(Dest, v1, 0x28u);
sub_F71127();
i = j_strlen(Dest);
for ( j = 0; (signed int)j < (signed int)i; ++j )
Dest[j] += j;
v2 = j_strlen(Dest);
strncmp(Dest, Str2, v2);
if ( sub_F71127() )
sub_F7132F("wrong flag!\n", v4);
else
sub_F7132F("rigth flag!\n", v4);
sub_F7126C(&savedregs, &dword_F75890);
sub_F71280();
return sub_F71127();
}
代码有点长。。大概意思就是
将输入的串Str1先进行base64加密 再与串Str2比较 若相等 则输出"right flag" ##PS 来自https://blog.csdn.net/xiangshangbashaonian/article/details/78923289
str2=="e3nifIH9b_C@n@dH"
解密的脚本参照这个师傅
import base64
s ="e3nifIH9b_C@n@dH"
flag =""
for i in range(len(s)):
flag += chr(ord(s[i])- i)
flag = base64.b64decode(flag)
print(flag)
得到 flag{i_l0ve_you}'