强网杯2018_hide
感慨
这次队友有事,个人单刷,导致没有全力做re,想着一个人随便做做,结果加密和杂项做了六道,re只做了一道。
最遗憾的就是这道re,比赛的时候只差最后一步。怪自己没有坚持
题目设置
加壳+反调试
ptrace反调试,杭电大师傅告诉我可以用strace,膜。
很皮的就是,第一次过了反调试,你dump下来会得到一个假flag,我佛了。
第二次过反调试并dump 下来,得到真正逻辑
解题脚本
参考杭电大师傅的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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56from struct import *
encry='52B8137F358CF21BF46386D2734F1E31'.decode('hex')
#52B8137F358CF21BF46386D2734F1E31
num=[0x70493173,0x45723350,0x79523376,0x33593464]
it=0x676E696C
def i2s(s1):
out=''
for i in range(4):
out+=pack("I",s1[i])
return out
def s2i(n2):
out1=[]
for i in range(len(n2)/4):
out1.append(unpack("I",n2[i*4:i*4+4])[0])
return out1
def so_encry1(s,num,it):
n1=0
s=s2i(s)
for i in range(8):
n1=n1+it
n1=n1&0xffffffff
for i in range(8):
s[3]-=(num[(n1>>11)&3]+n1)^(((s[2]>>5)^(16*s[2]))+s[2])
s[3]=s[3]&0xffffffff
n1-=it
n1=n1&0xffffffff
s[2]-=(num[n1&3]+n1)^(((s[3]>>5)^(16*s[3]))+s[3])
s[2]=s[2]&0xffffffff
print s[2]
n1=0
for i in range(8):
n1=n1+it
n1=n1&0xffffffff
for i in range(8):
s[1]-=(num[(n1>>11)&0x3]+n1)^(((s[0]>>5)^(16*s[0]))+s[0])
s[1]=s[1]&0xffffffff
n1-=it
n1=n1&0xffffffff
s[0]-=(num[n1&3]+n1)^(((s[1]>>5)^(0x10*s[1]))+s[1])
s[0]=s[0]&0xffffffff
return i2s(s)
def so_encry2(st):
st1=''
for i in range(16):
a=ord(st[i])
a^=i
st1+=chr(a)
return st1
d=so_encry2(encry)
d=so_encry1(d,num,it)
d=so_encry2(d)
d=so_encry1(d,num,it)
d=so_encry2(d)
d=so_encry1(d,num,it)
print d
###结果
###flag
近期真的不要打ctf了,做点实际东西刷点简历,我ball ball我自己
//nextrsa和strgame3的wp出来了还是要看的
some else
我知道我们会相遇的 这是我坚持到现在的全部意义