每次更完博客,心情都能平静下来,所以今天再来试试(?)
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
的每一位。双击x
和y
去看看它们分别是什么。
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
框中进行如下操作。
其中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
去逆的时候在加密函数的部分失败了,你说巧不巧……于是跑去问出题人(我大哥!),出题人说是编译环境版本太新的缘故,于是这道题分数就上调了……
卡了几天,后来看到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
我好想会啊。。