Flare2-challenge-03

2023-12-09

文件信息

解压密码 flare, 解压之后得到 elfie.exe, 同样,使用 DIE 查看文件信息:

且文件有一个“特殊”图标(pyinstaller)

strings 命令可以看到 pyinstaller 相关的特征字符串:

GitHub 上有一个解包的项目pyinstxtractor

关键文件逻辑

解包之后得到 elfie.exe_extracted 目录,里面有文件同名的 py 文件(elfie.pyc), 此文件即是主体逻辑文件:

# .... something trivival ....
O00OO00OOO0OOOO0OOOO0OO00000OOO0 += 'xDUmhGcnRDcnd4VkF5'
O00OO00OOO0OOOO0OOOO0OO00000OOO0 += 'aTBTMXd3OC8yY0ZqdzBIU0JMT0tEcktGckJUTkpvRGw2d'
O00OO00OOO0OOOO0OOOO0OO00000OOO0 += 'nNocTB'
import base64
exec(base64.b64decode(OOO0OOOOOOOO0000O000O00O0OOOO00O + O0O00OO0OO00OO00OO00O000OOO0O000 # so many variable define above)

可以将 exec 改成 print 得到 base64 解码之后的输出:

1class OO00O0O00OOO00OOOO0O00O0000OOOOO(getattr(QtGui, 'tidEtxeTQ'[::-1])):
2 def __init__(self, OO0O0O0O0OO0OO00000OO00O0O0000O0, OO00O00O00OO00OO0OO0OO000O0O00OO, OO0OOO00O00O0OO00000OO0000OO0OOO):
3 super(OO00O0O00OOO00OOOO0O00O0000OOOOO, self).__init__(OO0O0O0O0OO0OO00000OO00O0O0000O0)
4 self.OO0O0O0O0OO0OO00000OO00O0O0000O0 = OO0O0O0O0OO0OO00000OO00O0O0000O0
5 self.OO00O00O00OO00OO0OO0OO000O0O00OO = OO00O00O00OO00OO0OO0OO000O0O00OO
6 self.OO0OOO00O00O0OO00000OO0000OO0OOO = OO0OOO00O00O0OO00000OO0000OO0OOO
7 self.OOOOOOOOOO0O0OOOOO000OO000OO0O00 = False
8
9 def O000OOOOOO0OOOO00000OO0O0O000OO0(self):
10 O0O0O0000OOO000O00000OOO000OO000 = getattr(self, 'txeTnialPot'[::-1])()
11 if (O0O0O0000OOO000O00000OOO000OO000 == ''.join((OO00O00OOOO00OO000O00OO0OOOO0000 for OO00O00OOOO00OO000O00OO0OOOO0000 in reversed('moc.no-eralf@OOOOY.sev0000L.eiflE')))):
12 self.OO0O0O0O0OO0OO00000OO00O0O0000O0.setWindowTitle('!sseccus taerg'[::-1])
13 self.OOOOOOOOOO0O0OOOOO000OO000OO0O00 = True
14 self.OO0O0O0O0OO0OO00000OO00O0O0000O0.setVisible(False)
15 self.OO0O0O0O0OO0OO00000OO00O0O0000O0.setVisible(True)
16
17 def keyPressEvent(self, OO000O0O0OOOOOO0OO0OO00O0OOO00OO):
18 if ((OO000O0O0OOOOOO0OO0OO00O0OOO00OO.key() == getattr(QtCore, 'tQ'[::-1]).Key_Enter) or (OO000O0O0OOOOOO0OO0OO00O0OOO00OO.key() == getattr(QtCore, 'tQ'[::-1]).Key_Return)):
19 self.O000OOOOOO0OOOO00000OO0O0O000OO0()
20 else:
21 super(OO00O0O00OOO00OOOO0O00O0000OOOOO, self).keyPressEvent(OO000O0O0OOOOOO0OO0OO00O0OOO00OO)
22
23 def paintEvent(self, OO000O0O0OOOOOO0OO0OO00O0OOO00OO):
24 OOOOOOOOOO00O00O0OO0OO00OOO0OOO0 = getattr(self, 'tropweiv'[::-1])()
25 O000OOO000O0OO00O00OO0O00O0O00O0 = getattr(QtGui, 'retniaPQ'[::-1])(OOOOOOOOOO00O00O0OO0OO00OOO0OOO0)
26 if self.OOOOOOOOOO0O0OOOOO000OO000OO0O00:
27 getattr(O000OOO000O0OO00O00OO0O00O0O00O0, 'pamxiPward'[::-1])(getattr(self, 'tcer'[::-1])(), self.OO0OOO00O00O0OO00000OO0000OO0OOO)
28 else:
29 getattr(O000OOO000O0OO00O00OO0O00O0O00O0, 'pamxiPward'[::-1])(getattr(self, 'tcer'[::-1])(), self.OO00O00O00OO00OO0OO0OO000O0O00OO)
30 super(OO00O0O00OOO00OOOO0O00O0000OOOOO, self).paintEvent(OO000O0O0OOOOOO0OO0OO00O0OOO00OO)
31OOO00O000O0000OO000OO0000O000000 = getattr(QtGui, 'noitacilppAQ'[::-1])(['000000000000000000000000'[::-1]])
32OO0000OOOOO000000OO0OOO00OO00OOO = getattr(QtGui, 'wodniWniaMQ'[::-1])()
33OO00O00O00OO00OO0OO0OO000O0O00OO = getattr(QtGui, 'pamxiPQ'[::-1])()
34getattr(OO00O00O00OO00OO0OO0OO000O0O00OO, 'ataDmorFdaol'[::-1])(getattr(base64, 'edoced46b'[::-1])(OOO00O00OO0OO000OOOO00000000OOO0))
35OO0OOO00O00O0OO00000OO0000OO0OOO = getattr(QtGui, 'pamxiPQ'[::-1])()
36getattr(OO0OOO00O00O0OO00000OO0000OO0OOO, 'ataDmorFdaol'[::-1])(getattr(base64, 'edoced46b'[::-1])(OO0O00000OO0O0O0OOOO0OO0OOO000O0))
37OO00OOOOOO0000000OOO0O000OO0O0OO = getattr(OO00O00O00OO00OO0OO0OO000O0O00OO, 'htdiw'[::-1])()
38O000OO0O00O00O00O0OOOOOO00O000OO = getattr(OO00O00O00OO00OO0OO0OO000O0O00OO, 'thgieh'[::-1])()
39getattr(OO0000OOOOO000000OO0OOO00OO00OOO, 'eltiTwodniWtes'[::-1])('!ereht eno dnif nac uoy !edisni kooL'[::-1])
40getattr(OO0000OOOOO000000OO0OOO00OO00OOO, 'eziSdexiFtes'[::-1])(OO00OOOOOO0000000OOO0O000OO0O0OO, O000OO0O00O00O00O0OOOOOO00O000OO)
41OO000O0OO0000000OO0OO0O0000O0O00 = OO00O0O00OOO00OOOO0O00O0000OOOOO(OO0000OOOOO000000OO0OOO00OO00OOO, OO00O00O00OO00OO0OO0OO000O0O00OO, OO0OOO00O00O0OO00000OO0000OO0OOO)
42getattr(OO0000OOOOO000000OO0OOO00OO00OOO, 'tegdiWlartneCtes'[::-1])(OO000O0OO0000000OO0OO0O0000O0O00)
43getattr(OO0000OOOOO000000OO0OOO00OO00OOO, 'wohs'[::-1])()
44getattr(OOO00O000O0000OO000OO0000O000000, '_cexe'[::-1])()

可以看到高亮行中有一个命令类似 flag 的字符串,并且代码中也是 reversed with:

Important

if (O0O0O0000OOO000O00000OOO000OO000 == ‘’.join((OO00O00OOOO00OO000O00OO0OOOO0000 for OO00O00OOOO00OO000O00OO0OOOO0000 in reversed(‘moc.no-eralf@OOOOY.sev0000L.eiflE’)))):

Solution

echo moc.no-eralf@OOOOY.sev0000L.eiflE | rev

输入此 flag