1.Bugku刷题
love
IDA反编译,找一下关键代码块。
sub_41132F("please enter the flag:", v7);
sub_411375("%20s", (char)Str);
v3 = j_strlen(Str);
v4 = (const char *)sub_4110BE(Str, v3, v14);
strncpy(Destination, v4, 0x28u);
v11 = j_strlen(Destination);
for ( j = 0; j < v11; ++j )
Destination[j] += j;
v5 = j_strlen(Destination);
if ( !strncmp(Destination, Str2, v5) )
sub_41132F("rigth flag!\n", v8);
else
sub_41132F("wrong flag!\n", v8);
可知Str2="e3nifIH9b_C@n@dH"为flag加密后的字符串。
Shift+F12查看字符串。
看到一个base64input,猜想其中会有base64加密。
输入会存储为Str,v3为Str的长度,然后会经过sub_4110BE函数来生成v4。
双击跳转到sub_4110BE函数。
双击标黄的列表跳转,发现这就是base64的字符集,所以sub_4110BE函数大概率是个base64编码函数。
接下来是一个字符串拷贝函数,将v4拷贝给Destination[],v11是Destination[]的长度。然后对Destination[]进行操作,得到Str2。
我们只需将str2进行逆操作,然后再base64解密,即可得到flag。
import base64
Str2='e3nifIH9b_C@n@dH'
Str2_list=list(Str2)
flag=''
for i in range(0,len(Str2)):
Str2_list[i]=chr(ord(Str2_list[i])-i)
flag+=Str2_list[i]
print(base64.b64decode(flag))