攻防世界逆向高手题之re4-unvm-me
继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向高手题的re4-unvm-me
下载附件,是.pyc文件,用在线网站反编译:
https://tool.lu/pyc/
#!/usr/bin/env python
# visit https:
import md5
md5s = [
0x831DAA3C843BA8B087C895F0ED305CE7L,
0x6722F7A07246C6AF20662B855846C2C8L,
0x5F04850FEC81A27AB5FC98BEFA4EB40CL,
0xECF8DCAC7503E63A6A3667C5FB94F610L,
0xC0FD15AE2C3931BC1E140523AE934722L,
0x569F606FD6DA5D612F10CFB95C0BDE6DL,
0x68CB5A1CF54C078BF0E7E89584C1A4EL,
0xC11E2CD82D1F9FBD7E4D6EE9581FF3BDL,
0x1DF4C637D625313720F45706A48FF20FL,
0x3122EF3A001AAECDB8DD9D843C029E06L,
0xADB778A0F729293E7E0B19B96A4C5A61L,
0x938C747C6A051B3E163EB802A325148EL,
0x38543C5E820DD9403B57BEFF6020596DL]
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'
. .
突然遇到python逆向有点懵住了,以前都是C语言逆向,一下子竟然忘了流程,现在回顾一下: . . 照着流程我们开始分析,但在分析之前先纠正一个我的误区:
(这里积累第一个经验) 列表是以逗号 分隔元素的,md5s[i/5]取的是每一个逗号前的元素,这里一个元素是0x831DAA3C843BA8B087C895F0ED305CE7L 这种这么长的,一开始我直接被带偏了,以为是从这么长的十六进制字符串中抽取,现在明白了,md5s列表中就是以这么长的数为一个基本元素的,i/5就是从这十三个长数中挑一个。
. 那么按照流程来第一步确定flag的数量,md5s列表有13组,flag是5的倍数而且小于等于65,md5s[i/5]中i为65的话就刚好遍历md5s数组,所以flag是65个字符。
第二步,找到已确定的字符串作为基点反推字符: 很明显基点是md5s[i/5]。
第三步,找到逻辑中与flag直接相关的部分,爆破或反向。不直接相关的部分正向复现: 下面是用s顺序取flag的5个字符(flag[i:i+5]中i+5优先级大于:),然后md5加密后与md5s的13组元素顺序比较,那逆向逻辑不就是md5得13组元素每组对应flag的5个字符吗?
所以直接取md5s列表的13组元素md5转明文即可:
https:
(这里积累第二个经验) 这里md5s列表中的元素大都是32为的刚好是md5的位数,只有一个不是,如下列红框框起来的,这种要在前面高位补0 才行。 . . (这里积累第三个经验) 这里还有个小插曲,一开始我用alexctf来正向尝试爆破md5值,因为比赛通常是以赛名为flag前缀的嘛,结果当然是错的。正确的5位字符多试试说不定可以,但是alexctf是6位字符,md5加密不管多少字符都给你输出16位或32位密文,所以多一位或少一位就完全对不上了。 . .
总结:
0: 回顾了逆向流程:
1: (这里积累第一个经验) 列表是以逗号 分隔元素的,md5s[i/5]取的是每一个逗号前的元素,这里一个元素是0x831DAA3C843BA8B087C895F0ED305CE7L 这种这么长的,一开始我直接被带偏了,以为是从这么长的十六进制字符串中抽取,现在明白了,md5s列表中就是以这么长的数为一个基本元素的,i/5就是从这十三个长数中挑一个。
2: (这里积累第二个经验) 这里md5s列表中的元素大都是32为的刚好是md5的位数,只有一个不是,如下列红框框起来的,这种要在前面高位补0 才行。
3: (这里积累第三个经验) 这里还有个小插曲,一开始我用alexctf来正向尝试爆破md5值,因为比赛通常是以赛名为flag前缀的嘛,结果当然是错的。正确的5位字符多试试说不定可以,但是alexctf是6位字符,md5加密不管多少字符都给你输出16位或32位密文,所以多一位或少一位就完全对不上了。
解毕!敬礼!
|