buu部分题目复现

107 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

刮开有奖

打开

查壳后拖进ida

先查看下字符串

有个变表的base64加密

然后看波主函数

没看出啥东西

先将ASCII码转成字符串

string应该是要求的字符串,有八位

然后没思路了

[BUUCTF]REVERSE——刮开有奖_Angel~Yan的博客-CSDN博客

参考了一下大佬的wp

先用脚本解出base64

import base64
data0= 'ak1w'
print(base64.b64decode(data0))


data1= 'V1Ax'
print(base64.b64decode(data1))

这里不知道为啥用变表解出来不对,只能用正常base64

得到6位字符串

然后

sub_4010F0(v7, 0, 10);   //39行的这个函数对v7进行了升序排序

使用excll表排序

排序结果为

51 67 69 72 74 78 83 90 97 103 110

3,C,E,H,J,N,S,Z,a,g

然后接着看第50行

纯计算题,算出结果后转为ASCII码

 if ( String[0] == v7[0] + 34             //str0 = U
        && String[1] == v10               //str1 = J
        && 4 * String[2] - 141 == 3 * v8  //str2 = W
        && String[3] / 4 == 2 * (v13 / 9) //str3 = P

得到字符串顺序,同时也知道了前两位字符串,拼接上得到

UJWP1jMp

Java逆向

下载后是个.class类文件

用IntelliJ IDEA打开查看

可以看到

我们输入的字符串+64后再与32异或

然后与KEY数组进行比较

所以根据算法写出逆向脚本

list=[180, 136, 137, 147, 191, 137, 147, 191, 148, 136, 133, 191, 134, 140, 129, 135, 191, 65]
s = []
flag=''
for i in range(18):
    s.append(list[i]-64^32)
print(s)
for i in s:
    flag += chr(i)
print(flag)

得到flag