hctf2017 level1

Author Avatar
Xzhah 11月 21, 2017
  • 在其它设备中阅读本文章

* 用户名

首先会有个用户验证


逻辑就是先把第几位与倒数第几位互换,然后进行异或加减的操作。
得到用户名应该是M.KATSURAGI

* start code

静态分析完发现坑爹的是,你根本不需要管其他的,你把start code得到就是flag。也就是说逆的用户名只是一个。。。摆设(毕竟hctf电竞比赛,可能师傅们喜欢享受通关顺便拿个flag)
输入放在41b4f0中,其实最怕的就是这种显示出来是自己写的输入函数了,搞不好直接在输入的时候做手脚。

然后把所有的字符进行异或处理

然后第7-14,14-21,21-28位分别做异或乘除之类的处理


最后与下面的数据作比较

* 解题脚本

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
key=[0x1e,0x15,0x2,0x10,0x0d,0x48,0x48,0x6f,0xdd,0xdd,0x48,0x64,0x63,0xd7,0x2e,0x2c,0xfe,0x6a,0x6d,0x2a,0xf2,0x6f,0x9a,0x4d,0x8b,0x4b,0xba,0xfa,0x41,0x47,0x12,0x43,0x13,0x15,0xb]
flag=[0x1e,0x15,0x2,0x10,0x0d,0x48,0x48,0x6f,0xdd,0xdd,0x48,0x64,0x63,0xd7,0x2e,0x2c,0xfe,0x6a,0x6d,0x2a,0xf2,0x6f,0x9a,0x4d,0x8b,0x4b,0xba,0xfa,0x41,0x47,0x12,0x43,0x13,0x15,0xb]
def change1(a):
a=a^0xad
a=((a&0xaa)>>1)|(a<<1)&0xaa
return a
def change2(a):
a=a^0xbe
a=((a&0xcc)>>2)|(a<<2)&0xcc
return a
def change3(a):
a=a^0xef
a=((a&0xf0)>>4)|(a<<4)&0xf0
return a
for i in range(7,14):
for j in range(128):
if(change1(j)==key[i]):
j=j^0x76
flag[i]=chr(j)
for i in range(14,21):
for j in range(128):
if(change2(j)==key[i]):
j=j^0x76
flag[i]=chr(j)
for i in range(21,28):
for j in range(128):
if(change3(j)==key[i]):
j=j^0x76
flag[i]=chr(j)
for i in range(0,7):
a=key[i]^0x76
flag[i]=chr(a)
for i in range(28,35):
a=key[i]^0x76
flag[i]=chr(a)
print(''.join(a for a in flag))

* 结果

其实每个队伍的结尾部分是不一样的,膜拜hctf大佬在反作弊方面的用心