buuctf做题记录
查壳
64位无壳
IDA分析
main函数很明显的给了一个密文d2G0ZjLwHjS7DmOzZAY0X2lzX3CoZV9zdNOydO9vZl9yZXZlcnGlfD==
和提示:这是一个特殊的base64加密。
给了这样的提示,推测是base64换表
那么查看加密函数:
加密表点进去:
是正常的表,直接用原表解密解不出flag,右键查看表的引用,发现除了加密函数之外还有一个函数对表进行了操作:
点进去查看,果然是改了表:
简单写个脚本解出更改后的表:
#include<iostream>
using namespace std;
int main()
{
char b[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
for(int i=0;i<=9;i++)
{
int v1 = b[i];
b[i] = b[19-i];
int r = 19-i;
b[r] = v1;
}
cout << b;
}
得到新表TSRQPONMLKJIHGFEDCBAUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
利用新表进行base64解密:
import base64
str1 = "d2G0ZjLwHjS7DmOzZAY0X2lzX3CoZV9zdNOydO9vZl9yZXZlcnGlfD=="
string1 = "TSRQPONMLKJIHGFEDCBAUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
print ((base64.b64decode((str1.translate(str.maketrans(string1,string2))).encode())).decode())
得到flag
按照buuctf的规则换成flag{}包起来提交即可。
小记
遇到过换表的,但是第一次遇到用函数换表而不是一开始就是新表的,经验++