只做了个签到题

Re

cosmo

  • 运行,提示输入flag,尝试输入,显示No;
  • 逆向,找提示的字符串以及No,定位到判断的函数;
  • 调试,找到输入,调试函数,发现函数应该是返回输入长度,需要38个字符;
  • 看代码,有一个函数一次处理两个bytes,仔细看第一个参数限制了处理的逻辑,最后的else才是真正处理的地方;
  • 看到常数转成10进制(4223091239536077)去github上搜索,发现adler32校验码的算法很像;
  • 仔细看了逆向代码,发现不难逆,正向写一圈就知道怎么算了,然后写逆向函数;
  • 提取中间的校验值,带入计算,其中大部分可以直接出答案,部分会有负数的情况,加模数65521再模可以防止出现负数的情况;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 导出的数据
mmmid=[]

def oriAlgo(a,b,x):
b+=2*a+2*x[0]+x[1]
a+=x[0]+x[1]
return a,b

def reAlgo(a,b):
return b-a,2*a-b

def solit():
global mmmid
last_x=1
last_y=0
try:
for i in range(len(mmmid)):
cur_x=mmmid[i]&0xffff
cur_y=(mmmid[i]>>16)&0xffff

p_plus_q=cur_x-last_x
p2_plus_q=(cur_y-last_y-2*last_x+65521)%65521
print(chr(p2_plus_q-p_plus_q),end='')
print(chr(2*p_plus_q-p2_plus_q),end='')

last_x=cur_x
last_y=cur_y
except:
print()
print(hex(p_plus_q))
print(hex(p2_plus_q))
print(hex(p2_plus_q-p_plus_q))
print(hex(2*p_plus_q-p2_plus_q))



if __name__=='__main__':
# a,b=oriAlgo(1,0,[ord('1'),ord('2')])
# print(hex(a))
# print(hex(b))
solit()