1.Bugku刷題
love
IDA反編譯,找一下關(guān)鍵代碼塊。
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查看字符串。

1-1
看到一個(gè)base64input,猜想其中會(huì)有base64加密。
輸入會(huì)存儲(chǔ)為Str,v3為Str的長度,然后會(huì)經(jīng)過sub_4110BE函數(shù)來生成v4。
雙擊跳轉(zhuǎn)到sub_4110BE函數(shù)。

1-2

1-3
雙擊標(biāo)黃的列表跳轉(zhuǎn),發(fā)現(xiàn)這就是base64的字符集,所以sub_4110BE函數(shù)大概率是個(gè)base64編碼函數(shù)。
接下來是一個(gè)字符串拷貝函數(shù),將v4拷貝給Destination[],v11是Destination[]的長度。然后對(duì)Destination[]進(jìn)行操作,得到Str2。
我們只需將str2進(jìn)行逆操作,然后再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))