u1s1这次比赛我挺羡慕新生的。指导详尽友好得一,夸一波全体出题人!
re
protection
  这个题首先用upx脱壳,使用方法是upx -d file,然后拖入ida,找到主函数,按下f5,看到逻辑如下:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | printf((unsigned __int64)"please input your flag: ");_isoc99_scanf((unsigned __int64)"%28s");
 for ( i = 0; i <= 27; ++i )
 {
 if ( ((unsigned __int8)x[i] ^ (unsigned __int8)v5[i]) != y[i] )
 {
 puts("wrong!", v5);
 return 0;
 }
 }
 puts("right!", v5);
 
 | 
  就是将输入与字符串x的每一位进行异或看结果是否等于y的每一位。双击x和y去看看它们分别是什么。
| 12
 3
 4
 5
 6
 
 | .data:00000000004CB0F0 x               db 'aouv#@!V08asdozpnma&*#%!$^&*',0...
 .data:00000000004CB110 y               db 0Ch, 0, 10h, 15h, 57h, 26h, 5Ah, 23h, 2 dup(40h), 3Eh
 .data:00000000004CB110                                         ; DATA XREF: main+6E↑o
 .data:00000000004CB110                 db 42h, 37h, 30h, 9, 19h, 3, 1Dh, 50h, 43h, 7, 57h, 15h
 .data:00000000004CB110                 db 7Eh, 51h, 6Dh, 43h, 57h, 4 dup(0)
 
 | 
  这里提取y的时候可以在ida界面下方的python框中进行如下操作。

  其中get_bytes(address,length)第一个参数是起始地址,第二个是要提取的数据长度。
这个东东好像是叫idapython来着,高级用法还挺多的,不过我还不大会用……目前只记住了这个
  接下来进行异或就完了:
| 12
 3
 4
 
 | a=[12, 0, 16, 21, 87, 38, 90, 35, 64, 64, 62, 66, 55, 48, 9, 25, 3, 29, 80, 67, 7, 87, 21, 126, 81, 109, 67, 87]s='aouv#@!V08asdozpnma&*#%!$^&*'
 for i in range(28):
 print(chr(a[i]^ord(s[i])),end='')
 
 | 
输出结果:
moectf{upx_1S_simp1e-t0_u3e}
MidPython
  哈哈哈这题挺好玩。用uncompyle6去逆的时候在加密函数的部分失败了,你说巧不巧……于是跑去问出题人,出题人说是编译环境版本太新的缘故,于是这道题分数就上调了……

  卡了几天,后来看到hint里这句本题考点更高级一点,与easy Python做法完全不同,建议多多了解Python语言,不仅仅只是语法,也包括Python的运行原理等。哦,完全不同是吧。我好像明白了什么。于是去百度python运行原理,联系曾经把相对路径里某个文件命名成string.py,又在文件里import string导致调用封装好的函数时却报了undefined的经历,我想我知道做法了。。根据试验结果看(什么鬼),在python文件中import另一个python文件时会优先从当前目录找,找不到才会去安装路径里找,并且会生成.pyc文件。然后试了下import时只要当前路径下有同名.pyc文件同样可以正常运行。这应该就是利用解密函数的思路了。
  虽然没办法全逆出来,但是逆出来正常的部分已经足够做题了。下面是逆出来的结果(删去了失败的部分)。
| 12
 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
 56
 57
 58
 59
 60
 61
 
 | # uncompyle6 version 3.7.1# Python bytecode 3.8 (3413)
 # Decompiled from: Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 22:39:24) [MSC v.1916 32 bit (Intel)]
 # Embedded file name: ./EzPython/source.py
 # Compiled at: 2020-07-25 16:57:06
 # Size of source mod 2**32: 5784 bytes
 T_letter = ['', '', '', '', '']
 
 def Create_Matrix(key):
 key = Remove_Duplicates(key)
 key = key.replace(' ', '')
 j = 0
 for i in range(len(key)):
 T_letter[j] += key[i]
 if 0 == (i + 1) % 5:
 j += 1
 
 
 def Remove_Duplicates(key):
 key = key.upper()
 _key = ''
 for ch in key:
 if ch == 'I':
 ch = 'J'
 if ch in _key:
 continue
 else:
 _key += ch
 
 return _key
 
 
 def Get_MatrixIndex(ch):
 for i in range(len(T_letter)):
 for j in range(len(T_letter)):
 if ch == T_letter[i][j]:
 return (i, j)
 
 
 if __name__ == '__main__':
 key = 'YWCNOPJAFGHDTULMQXZEBRVKS'
 flag_enc = 'WYTFSQOYGYOQKJLHUE'
 Create_Matrix(key)
 print('Please Input flag: ')
 plaintext = input()
 if plaintext[0:7] != 'moectf{' or plaintext[(-1)] != '}':
 print('Ruaaaaa~Wrong!')
 input()
 exit()
 else:
 plaintext = plaintext[7:-1]
 flag = Encrypt(plaintext, T_letter)
 if flag != flag_enc:
 print('Ruaaaaa~Wrong!')
 input()
 exit()
 else:
 pass
 print('Congratulations!')
 input()
 exit()
 
 | 
对去除前后缀以后的部分进行加密,若加密后与flag_enc相同则成功。
| 12
 3
 4
 5
 6
 7
 
 | from puzzle import *key = 'YWCNOPJAFGHDTULMQXZEBRVKS'
 flag_enc = 'WYTFSQOYGYOQKJLHUE'
 Create_Matrix(key)
 print(T_letter)
 # 这个地方我其实有点惊讶,T_letter在另一个文件里定义了的话原来import后还可以直接在当前文件使用啊。。是我没见识
 print(Decrypt(flag_enc,T_letter))
 
 | 
输出结果:
['YWCNO', 'PJAFG', 'HDTUL', 'MQXZE', 'BRVKS']
YOUARENOPOWERFULLZ
包上moectf{}提交即可。