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}

Last modification:January 12, 2021
如果觉得我的文章对你有用,请随意赞赏。咖啡(12RMB)进度+100%,一块巧克力(1RMB)进度+6%。
(赞赏请备注你的名称哦!后台记录中来自理工小菜狗)