本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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
app1
拖进ide中查看源码
可以看到成功的条件是str1.length()= = str2.length()
在上面可以看到str2等于 versionName(版本名)
然后str2与 i 进行了异或操作
在上面同样可以看到 i 等于versionCode(版本号)
然后找到软件的版本名与版本号
写出逆向脚本
data = 'X<cP[?PHNB<P?aj'
data1=''
for i in range(len(data)):
data1 += chr(ord(data[i]) ^ 15)
print(data1)
得到结果
luc_guy
查壳后拖进ida,查看主函数后没有发现有用信息
查看字符串
然后双击这一行跟进
可以看到输出flag由f1和f2组成
双击f1跟进可以看到f1部分的字符串
然后f2经过case4和case5的加密再经过f1
所以先对case4进行分析,看不懂,先看case5
case5对8个字符进行了遍历,取余后余数为1的f2+j后减2
否则f2只进行+j(应该是这样)
所以case4应该是给了 f2 一个值
s应该是赋值的,但是s后面的没看懂
搜索了一下
s给的是16进制数组,s的存储方式是小端存储,所以要逆序
写出逆向脚本
data = [0x69,0x63,0x75,0x67,0x60,0x6f,0x66,0x7f]
f2 = ''
for i in range(8):
if i % 2 == 1:
f3 = data[i] - 2
else:
f3 = data[i] - 1
data[i] = f3
for i in data:
f2 += chr(i)
print(f2)
得到f2
拼起来得到flag
flag{do_not_hate_me}