当前位置: 代码迷 >> 综合 >> [buuctf]reverse3 base64特征
  详细解决方案

[buuctf]reverse3 base64特征

热度:20   发布时间:2023-11-04 22:44:33.0

[buuctf]reverse3

主函数逻辑

int sub_4156E0()
{
    int v0; // eax@6const char *v1; // eax@6size_t len; // eax@9char v4; // [sp+0h] [bp-188h]@6char v5; // [sp+Ch] [bp-17Ch]@1int v6; // [sp+10h] [bp-178h]@3int j; // [sp+DCh] [bp-ACh]@6int i; // [sp+E8h] [bp-A0h]@1char Dest[108]; // [sp+F4h] [bp-94h]@5char input; // [sp+160h] [bp-28h]@6char v11; // [sp+17Ch] [bp-Ch]@6unsigned int v12; // [sp+184h] [bp-4h]@1int savedregs; // [sp+188h] [bp+0h]@1memset(&v5, 0xCCu, 0x17Cu);v12 = (unsigned int)&savedregs ^ __security_cookie;for ( i = 0; i < 100; ++i ){
    v6 = i;if ( (unsigned int)i >= 0x64 )sub_411154();Dest[v6] = 0;}printf("please enter the flag:", v4);scanf("%20s", &input);v0 = j_strlen(&input);v1 = (const char *)base64((int)&input, v0, (int)&v11);// 对输入编码strncpy(Dest, v1, 0x28u);sub_411127();i = j_strlen(Dest);for ( j = 0; j < i; ++j )                     // 最终再遍历dest,把每个字符加上对应位数Dest[j] += j;len = j_strlen(Dest);strncmp(Dest, Str2, len);                     // 最终比较if ( sub_411127() )printf("wrong flag!\n", v4);elseprintf("rigth flag!\n", v4);sub_41126C(&savedregs, &dword_415890);sub_411280();return sub_411127();
}

逻辑很清楚,函数对输入首先进行base64编码,再把编码后的字符串加上对应位数,与指定字符串比较。

如何判断存在base64编码呢
打开sub_411AB0子程序
发现

一:if ( (signed int)(len / 3) % 3 )  这是在把字符串成三个一块,并计算最后有没有剩余的字符。
二:base64码表:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
三:进行移位操作(在进行把6个bit划分在一起的操作),并从码表中取值
*((_BYTE *)Dst + v5++) = aAbcdefghijklmn[(signed int)(unsigned __int8)byte_41A144[0] >> 2];
*((_BYTE *)Dst + v5++) = aAbcdefghijklmn[((signed int)(byte_41A144[1] & ~0xFFFFFF0F) >> 4) | 16 * (byte_41A144[0] & 3)];// aAbcdefghijklmn是base64码表

写出脚本

import base64
s="e3nifIH9b_C@n@dH"
l=[]
for i in range(0,len(s)):l.append(chr(ord(s[i])-i))
k=''.join(l)
print(base64.b64decode(k.encode()))
  相关解决方案