0%

moectf2020-部分writeup

  每次更完博客,心情都能平静下来,所以今天再来试试(?)

  y1s1这次比赛我挺羡慕新生的。指导详尽友好得一批,夸一波全体出题人!

re

是大哥的方向!>_<

protection

  这个题首先用upx脱壳,使用方法是upx -d file,然后拖入ida,找到主函数,按下f5,看到逻辑如下:

1
2
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的每一位。双击xy去看看它们分别是什么。

1
2
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框中进行如下操作。
idapython.png
  其中get_bytes(address,length)第一个参数是起始地址,第二个是要提取的数据长度。

这个东东好像是叫idapython来着,高级用法还挺多的,不过我还不大会用……目前只记住了这个

  接下来进行异或就完了:

1
2
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去逆的时候在加密函数的部分失败了,你说巧不巧……于是跑去问出题人(我大哥!),出题人说是编译环境版本太新的缘故,于是这道题分数就上调了……
midpython.png
  卡了几天,后来看到hint里这句本题考点更高级一点,与easy Python做法完全不同,建议多多了解Python语言,不仅仅只是语法,也包括Python的运行原理等。哦,完全不同是吧。我好像明白了什么。于是去百度python运行原理,联系曾经把相对路径里某个文件命名成string.py,又在文件里import string导致调用封装好的函数时却报了undefined的经历,我想我知道做法了。。根据试验结果看(什么鬼),在python文件中import另一个python文件时会优先从当前目录找,找不到才会去安装路径里找,并且会生成.pyc文件。然后试了下import时只要当前路径下有同名.pyc文件同样可以正常运行。这应该就是利用解密函数的思路了。

  虽然没办法全逆出来,但是逆出来正常的部分已经足够做题了。下面是逆出来的结果(删去了失败的部分)。

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
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相同则成功。

1
2
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{}提交即可。

click it

  借这个题稍微熟悉一下安卓逆向。推荐下happy学长讲的安卓基础知识。用安卓模拟器打开。本辣鸡的jeb又特么出问题了,写不了了,上课去了

flower

我好想会啊。。