第二次见python相关的题目,不知道怎么入手,抄了抄了。(原答案链接:https://www.pythonf.cn/read/159367,感谢大佬指点)
拿到的是一个pyc后缀的文件,用Pycharm直接打开是乱码。能直接打开还能叫Re题?
放入python在线反编译网站得到源代码(网址:http://tool.lu/pyc/)
import md5 md5s = [ 0x831DAA3C843BA8B087C895F0ED305CE7, 0x6722F7A07246C6AF20662B855846C2C8, 0x5F04850FEC81A27AB5FC98BEFA4EB40C, 0xECF8DCAC7503E63A6A3667C5FB94F610, 0xC0FD15AE2C3931BC1E140523AE934722, 0x569F606FD6DA5D612F10CFB95C0BDE6D, 0x68CB5A1CF54C078BF0E7E89584C1A4E, 0xC11E2CD82D1F9FBD7E4D6EE9581FF3BD, 0x1DF4C637D625313720F45706A48FF20F, 0x3122EF3A001AAECDB8DD9D843C029E06, 0xADB778A0F729293E7E0B19B96A4C5A61, 0x938C747C6A051B3E163EB802A325148E, 0x38543C5E820DD9403B57BEFF6020596D] print 'Can you turn me back to python ? ...' flag = raw_input('well as you wish.. what is the flag: ') if len(flag) > 69: print 'nice try' exit() if len(flag) % 5 != 0: print 'nice try' exit() for i in range(0, len(flag), 5): s = flag[i:i + 5] if int('0x' + md5.new(s).hexdigest(), 16) != md5s[i / 5]: print 'nice try' exit() continue print 'Congratz now you have the flag'
是一个很简单的判断,两个if得到条件是flag长度<=69且是5的倍数,后一个for是每次将5个字符赋给s,然后将s的md5的摘要,前面加个‘0x’转变成16进制值,再与数组md5s中的每个值进行比较,如果相等则输出正确的信息。
用python把每5个字符所对应的md5摘要值计算出来。
md5s = [
0x831DAA3C843BA8B087C895F0ED305CE7,
0x6722F7A07246C6AF20662B855846C2C8,
0x5F04850FEC81A27AB5FC98BEFA4EB40C,
0xECF8DCAC7503E63A6A3667C5FB94F610,
0xC0FD15AE2C3931BC1E140523AE934722,
0x569F606FD6DA5D612F10CFB95C0BDE6D,
0x68CB5A1CF54C078BF0E7E89584C1A4E,
0xC11E2CD82D1F9FBD7E4D6EE9581FF3BD,
0x1DF4C637D625313720F45706A48FF20F,
0x3122EF3A001AAECDB8DD9D843C029E06,
0xADB778A0F729293E7E0B19B96A4C5A61,
0x938C747C6A051B3E163EB802A325148E,
0x38543C5E820DD9403B57BEFF6020596D]
raw_md5s = []
for each in md5s:
hex_val = hex(each)
raw_md5s.append(hex_val[2:])
print(raw_md5s)
['831daa3c843ba8b087c895f0ed305ce7', '6722f7a07246c6af20662b855846c2c8', '5f04850fec81a27ab5fc98befa4eb40c', 'ecf8dcac7503e63a6a3667c5fb94f610',
'c0fd15ae2c3931bc1e140523ae934722', '569f606fd6da5d612f10cfb95c0bde6d', '68cb5a1cf54c078bf0e7e89584c1a4e', 'c11e2cd82d1f9fbd7e4d6ee9581ff3bd',
'1df4c637d625313720f45706a48ff20f', '3122ef3a001aaecdb8dd9d843c029e06', 'adb778a0f729293e7e0b19b96a4c5a61', '938c747c6a051b3e163eb802a325148e',
'38543c5e820dd9403b57beff6020596d']
得到了摘要之后去网站上搜索对比一下就行了。需要注意的是,68cb5a1cf54c078bf0e7e89584c1a4e 少了一位,在前面手动补个0即可。(我也不知道为啥,原文这么写的,以后知道了再补)
https://www.cmd5.com/,这种网站好像还挺多的,懒得放了,这里放一个我自己用的
| md5 | 原始值 |
| 831daa3c843ba8b087c895f0ed305ce7 | ALEXC |
| 6722f7a07246c6af20662b855846c2c8 | TF{dv |
| 5f04850fec81a27ab5fc98befa4eb40c | 5d4s2 |
| ecf8dcac7503e63a6a3667c5fb94f610 | vj8nk |
| c0fd15ae2c3931bc1e140523ae934722 | 43s8d |
| 569f606fd6da5d612f10cfb95c0bde6d | 8l6m1 |
| 068cb5a1cf54c078bf0e7e89584c1a4e | n5l67 |
| c11e2cd82d1f9fbd7e4d6ee9581ff3bd | ds9v4 |
| 1df4c637d625313720f45706a48ff20f | 1n52n |
| 3122ef3a001aaecdb8dd9d843c029e06 | v37j4 |
| adb778a0f729293e7e0b19b96a4c5a61 | 81h3d |
| 938c747c6a051b3e163eb802a325148e | 28n4b |
| 38543c5e820dd9403b57beff6020596d |
6v3k} |
flag为 ALEXCTF{dv5d4s2vj8nk43s8d8l6m1n5l67ds9v41n52nv37j481h3d28n4b6v3k}
---------------------------------------分割线-------------------------------------------------------------
总结:第一次正式做python题,跟之前见过的c差别挺大的,虽然都属于Reverse,c感觉偏向于对代码的理解和对于flag的计算过程编写破解算法,以及函数功能的记忆和运用,python也有对于代码的理解,与c不同的是多了一些在线工具的使用,在这个题我也是第一次知道摘要这个东西,类似于一种验证码,可以根据给出的字符串生成摘要,如果数据被人修改过,产生的摘要也是截然不同的,通过在线网站也可以对摘要进行转换原始值。这题就是利用摘要这个东西对flag进行分段并取摘要,把摘要再加密一次才是给我们的密文,感觉收获不少。
浙公网安备 33010602011771号