CTF 【每日一题20160630】PYTHON 字节码
2016-07-01 22:47
453 查看
来源:http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=45
python ByteCode
请看这里: http://pan.baidu.com/s/1jGpB8DS
下载后是一个名为 crackme.pyc文件
python逆向基础资源:
用 Python 反编译 Python 软件:http://bbs.pediy.com/archive/index.php?t-111428.html
工具uncompyle2:https://github.com/wibiti/uncompyle2
本题分析:
1.话说用python中的dis模块可以自己编个反编译程序,但是我目前不会,就不罗嗦了。下载uncompyle2后,可以在终端进入uncompyle2目录下,找到setup.py,就可运行下列命令执行安装:
如果要反编译*.pyc程序,可以运行下列命令:
其他用法
然后在同目录下打开生成的crackme.py
我反编译出来的内容如下:
2.从程序看,KEY2内的整数似乎像ascii数值,但数字和英文字符少,直接转换意义不大。关键在于分析encrypt(KEY1, 5, flag)。
3.对encrypt函数的分析:用户输入一个字符串(ascii值必小于128),然后取出每个字符求其ascii值,加上seed,然后用其和与KEY1中一字符的ascii进行异或(算符^,注意+比^的优先级高),然后对255求余。
4.编写解密程序。显然正确的密码字符串加密后结果为KEY2,那么逆向分析编码即可。程序如下:
答案:WCTF{ILOVEPYTHONSOMUCH}
python ByteCode
请看这里: http://pan.baidu.com/s/1jGpB8DS
下载后是一个名为 crackme.pyc文件
python逆向基础资源:
用 Python 反编译 Python 软件:http://bbs.pediy.com/archive/index.php?t-111428.html
工具uncompyle2:https://github.com/wibiti/uncompyle2
本题分析:
1.话说用python中的dis模块可以自己编个反编译程序,但是我目前不会,就不罗嗦了。下载uncompyle2后,可以在终端进入uncompyle2目录下,找到setup.py,就可运行下列命令执行安装:
python setup.py install
如果要反编译*.pyc程序,可以运行下列命令:
python C:\Python27\Scripts\uncompyle2 crackme.pyc > crackme.py
其他用法
Examples: uncompyle2 foo.pyc bar.pyc # decompile foo.pyc, bar.pyc to stdout uncompyle2 -o . foo.pyc bar.pyc # decompile to ./foo.pyc_dis and ./bar.pyc_dis uncompyle2 -o /tmp /usr/lib/python1.5 # decompile whole library
然后在同目录下打开生成的crackme.py
我反编译出来的内容如下:
# 2016.06.30 18:21:49 中国标准时间 #Embedded file name: d:/idf.py def encrypt(key, seed, string): rst = [] for v in string: rst.append((ord(v) + seed ^ ord(key[seed])) % 255) seed = (seed + 1) % len(key) return rst if __name__ == '__main__': print "Welcome to idf's python crackme" flag = input('Enter the Flag: ') KEY1 = 'Maybe you are good at decryptint Byte Code, have a try!' KEY2 = [124, 48, 52, 59, 164, 50, 37, 62, 67, 52, 48, 6, 1, 122, 3, 22, 72, 1, 1, 14, 46, 27, 232] en_out = encrypt(KEY1, 5, flag) if KEY2 == en_out: print 'You Win' else: print 'Try Again !' +++ okay decompyling crackme.pyc # decompiled 1 files: 1 okay, 0 failed, 0 verify failed # 2016.06.30 18:21:50 中国标准时间
2.从程序看,KEY2内的整数似乎像ascii数值,但数字和英文字符少,直接转换意义不大。关键在于分析encrypt(KEY1, 5, flag)。
3.对encrypt函数的分析:用户输入一个字符串(ascii值必小于128),然后取出每个字符求其ascii值,加上seed,然后用其和与KEY1中一字符的ascii进行异或(算符^,注意+比^的优先级高),然后对255求余。
4.编写解密程序。显然正确的密码字符串加密后结果为KEY2,那么逆向分析编码即可。程序如下:
#python script KEY2 = [124, 48, 52, 59, 164, 50, 37, 62, 67, 52, 48, 6, 1, 122, 3, 22, 72, 1, 1, 14, 46, 27, 232] KEY1 = 'Maybe you are good at decryptint Byte Code, have a try!' def encrypt(key, seed, string): rst = [] for v in string: rst.append((ord(v) + seed ^ ord(key[seed])) % 255) seed = (seed + 1) % len(key) return rst def decrypt(key,seed,en_out ): string = '' for i in en_out : v = (i ^ ord(key[seed]))-seed seed = (seed + 1) % len(key) if v > 0: string += chr(v) return string if __name__ == '__main__': print decrypt(KEY1,5,KEY2)
答案:WCTF{ILOVEPYTHONSOMUCH}
相关文章推荐
- 被改错的密码
- 异性相吸_writeup
- 关于itf实验室 牛刀小试
- ctf训练营 包罗万象
- GCTF的re50反汇编分析
- About Xdctf【1】
- 2015第七届HCTF
- [WeChall] Training: ASCII (Training, Encoding)
- [WeChall] Training: WWW-Robots (HTTP, Training)
- [WeChall] Training: Crypto - Caesar I (Crypto, Training)
- VolgaCTF2015之lcg的writeup
- 32C3之PWN题目Readme的解法
- ZJPC-CTF_2015.11~12_writeup_by_GoldsNow
- 2015.12.31
- Boston Key Party CTF 2014 Crypto 200
- Boston Key Party CTF 2014 Crypto : 200
- Boston Key Party CTF 2014 Crypto 100
- 0ctf-2015-final:foodie
- [IDF实验室] CTF手札-牛刀小试
- 常用的加密 算法