关于base64换表及交叉引用

BUU[WUSTCTF2020]level3
分析

首先查壳,发现是64位的,就放入64位IDA,直接F5进入主函数看看

image-20220419171400715

看到了后面的一串需要base64解码的东西,然后前面还有一个base64encode的函数,这里应该就是base64的加密部分,点进去看看

image-20220419171546318

这里双击这个函数,看看他里面是些什么

image-20220419171634282

发现这就是常规的base64,没有什么不同,然后直接去解码

image-20220419171813510

一看就是错的,然后我又去外面看了看,发现只有这一个函数会有问题,于是想起交叉引用,这里对base64_table交叉引用

image-20220419172006865

发现新的函数,然后点进去看

image-20220419172031505

发现他对表进行了改动,于是写脚本去弄到新的表

脚本
#include<stdio.h>
#include<string.h>
int main()
{
char a[]={"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"};
for(int i=0;i<=9;i++)
{
char v1=a[i];
a[i]=a[19-i];
int b=19-i;
a[b]=v1;
}
printf("%s",a);
}

得到

TSRQPONMLKJIHGFEDCBAUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

然后去用base64换表弄一下

import base64
import string
str1 = "d2G0ZjLwHjS7DmOzZAY0X2lzX3CoZV9zdNOydO9vZl9yZXZlcnGlfD=="
string1 = "TSRQPONMLKJIHGFEDCBAUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
print (base64.b64decode(str1.translate(str.maketrans(string1,string2))))

得到flag

wctf2020{Base64_is_the_start_of_reverse}
总结

init和start一样都是编译器加进去的,init函数主要负责设置包、初始化变量或其他要在程序运行前优先完成的引导工作。所以不一定所有东西都会在main函数中运行,一般情况找不到东西了,就想着去交叉引用去找找有没有其它的东西