buu-reverse-reverse3题解
依照传统
通过string查找很容易找到主函数(详细见之前的reverse题解)
__int64 main_0()
{
// ......略去
sub_41132F("please enter the flag:");
sub_411375("%20s", &Str);
//Str输入后使用sub_4110BE函数处理然后赋值给Dest
v0 = j_strlen(&Str);
v1 = (const char *)sub_4110BE((int)&Str, v0, (int)&v11);
strncpy(Dest, v1, 0x28u);
v8 = j_strlen(Dest);
//Dest字符串每个值加上自己的index值
for ( j = 0; j < v8; ++j )
Dest[j] += j;
v2 = j_strlen(Dest);
//比较
if ( !strncmp(Dest, Str2, v2) )
sub_41132F("rigth flag!\n");
else
sub_41132F("wrong flag!\n");
HIDWORD(v4) = v3;
LODWORD(v4) = 0;
return v4;
}
新东西
那么关键就在于sub_4110BE
到底对Str
做了什么,于是点入这个函数(发现套娃继续点)然后发现
内容大体是目瞪口呆的其中反复出现了一个数组aAbcdefghijklmn
查明他的值
.rdata:00417B30 aAbcdefghijklmn db 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
联想到开头查看字符串发现的这个怀疑这一串是base64编码
那样的过转换过程就是
- 将值先用base64加密
- 然后再按位加上每位字符对应的下标(index)
//Str输入后使用sub_4110BE函数处理然后赋值给Dest
v0 = j_strlen(&Str);
v1 = (const char *)sub_4110BE((int)&Str, v0, (int)&v11);
strncpy(Dest, v1, 0x28u);
v8 = j_strlen(Dest);
//Dest字符串每个值加上自己的index值
for ( j = 0; j < v8; ++j )
Dest[j] += j;
v2 = j_strlen(Dest);
然后对比较部分的Str2
进行检查初始值
//比较
if ( !strncmp(Dest, Str2, v2) )
sub_41132F("rigth flag!\n");
else
sub_41132F("wrong flag!\n");
如下
.data:0041A034 Str2 db 'e3nifIH9b_C@n@dH',0 ; DATA XREF: _main_0+142↑o
于是只要对Str2
进行同样的操作就可以获得答案了,按照逆过程编写python脚本
import base64
str="e3nifIH9b_C@n@dH"
tmp=''
for i in range(len(str)):
tmp=tmp+chr(ord(str[i])-i)
print(base64.b64decode(tmp))
执行后输出答案
即flag{i_l0ve_you}