Reverse Learning - Day5

BUUCTF

JustRE

BJDCTF2020的签到题,查看字符串,定位到代码

将19999和0填入%d,获得flag{1999902069a45792d233ac}

简单的注册器

jadx打开apk文件,找到Main函数,开始分析代码

String xx为32位的flag,最后一位是‘a’,第2位是‘b’,第1位 + 第3位 - 48 = 56

第3,5,31,15位经过加密重新赋值

最后进一遍循环,把前16位和后16位颠倒

手算也可以,直接跑脚本

1
2
3
4
5
6
7
8
9
10
11
Str = '40c04462b4dd7c450528835cca15'
x = [i for i in Str]
x[2] = chr(ord(x[2]) + ord(x[3]) - 50)
x[4] = chr(ord(x[2]) + ord(x[5]) - 48)
x[30] = chr(ord(x[31]) + ord(x[9]) - 48)
x[14] = chr(ord(x[27]) + ord(x[28]) - 97)

for i in range(16):
x[i],x[31-i] = x[31-i],x[i]

print("flag{"+''.join(x)+"}")

flag{59acc538825054c7de4b26440c0999dd}

pyre

pyc文件,直接进行反编译

1
2
3
4
5
6
7
8
9
10
11
12
13
print 'Welcome to Re World!'
print 'Your input1 is your flag~'
l = len(input1)
for i in range(l):
num = ((input1[i] + i) % 128 + 128) % 128
code += num

for i in range(l - 1):
code[i] = code[i] ^ code[(i + 1)]

print code
code = ['\x1f', '\x12', '\x1d', '(', '0', '4', '\x01', '\x06', '\x14', '4', ',',
'\x1b', 'U', '?', 'o', '6', '*', ':', '\x01', 'D', ';', '%', '\x13']

这道题主要考的的是模运算

(a+b)%c = (a%c+b%c)%c

所以代码中的((input1[i] + i) % 128 + 128) % 128可以转换成(input1[i] + i) % 128

下面就是一个基本的异或

直接开始写脚本

1
2
3
4
5
6
7
8
9
code = ['\x1f', '\x12', '\x1d', '(', '0', '4', '\x01', '\x06', '\x14', '4', ',',
'\x1b', 'U', '?', 'o', '6', '*', ':', '\x01', 'D', ';', '%', '\x13']
flag = ''
l = len(code)
for i in range(l-2,-1,-1):
code[i] = chr(ord(code[i]) ^ ord(code[(i+1)]))
for i in range(l):
flag += chr((ord(code[i])-i)%128)
print(flag)

flag{Just_Re_1s_Ha66y!}

easyre

upx去壳

分析一下main函数

v4 = ‘’*F’"N,"(I?+@” v6是ACTF{} v7,v8,v9赋值给v5的前三位

观察循环体,知道flag为12位

主要就是分析一下_data_start__这个函数

意思是在这串字符中查找v4的字符,方法是字符下标-1等于v4字符的ASCII码

开始写脚本( ‘前要加上\进行转译)

1
2
3
4
5
6
7
8
9
key = '~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)(\'&%$# !"'  
v4 = [42,70,39,34,78,44,34,40,73,63,43,64]
x = []
flag = ''
for i in v4:
x.append(key.find(chr(i))+1)
for i in x:
flag += chr(i)
print("flag{"+flag+"}")

flag{U9X_1S_W6@T?}


Day5 - apk文件分析,pyc反汇编,模运算