攻防世界-re4-unvm-me

26 篇文章 1 订阅

1.下载附件,发现是pyc文件,将改文件上传到pyc反编译网站上。

#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
# Version: Python 2.7

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'

2.开始对代码进行逆向分析。

首先:flag长度不能超过69且是5的倍数。

然后:是对import md5库的理解

MD5模块用于产生消息摘要,康用来判断文件是否相同。

python的md5模块使用非常简单,包括以下几个函数:

  • md5.new([arg])
    • 返回一个md5对象,如果给出参数,则相当于调用了update(arg)
  • md5.md5(s)
    • 返回字符串s的md5
  • md5.updte(arg)
    • 用string参数arg更新md5对象。即将要计算arg的消息摘要值。
  • md5.digest()
    • 返回16字节的摘要,由传给update的string生成,摘要没有ascii字符
  • md5.hexdigest()
    • 以16进制的形式返回摘要,32位

用户输入一个字符串flag,每次从flag中取5个字符赋值给s,并计算s的md5的摘要,然后在前面加个0x ,转成16进制的值,再与数组md5s中的每个值进行比较。如果都相等,则输出正确的消息。

 3.脚本:

md5s = [174282896860968005525213562254350376167, 137092044126081477479435678296496849608,
        126300127609096051658061491018211963916, 314989972419727999226545215739316729360,
        256525866025901597224592941642385934114, 115141138810151571209618282728408211053,
        8705973470942652577929336993839061582, 256697681645515528548061291580728800189,
        39818552652170274340851144295913091599, 65313561977812018046200997898904313350,
        230909080238053318105407334248228870753, 196125799557195268866757688147870815374,
        74874145132345503095307276614727915885]
raw_md5s = []
for each in md5s:
    hex_val = hex(each)
    raw_md5s.append(hex_val[2:])

print(raw_md5s)

如果使用pyc网站,不出现以下结果,则使用脚本。

    0x831DAA3C843BA8B087C895F0ED305CE7L,
    0x6722F7A07246C6AF20662B855846C2C8L,
    0x5F04850FEC81A27AB5FC98BEFA4EB40CL,
    0xECF8DCAC7503E63A6A3667C5FB94F610L,
    0xC0FD15AE2C3931BC1E140523AE934722L,
    0x569F606FD6DA5D612F10CFB95C0BDE6DL,
    0x68CB5A1CF54C078BF0E7E89584C1A4EL,
    0xC11E2CD82D1F9FBD7E4D6EE9581FF3BDL,
    0x1DF4C637D625313720F45706A48FF20FL,
    0x3122EF3A001AAECDB8DD9D843C029E06L,
    0xADB778A0F729293E7E0B19B96A4C5A61L,
    0x938C747C6A051B3E163EB802A325148EL,
    0x38543C5E820DD9403B57BEFF6020596DL]

 记得将0x和最后的L去掉。还有在第七行中缺少一个字符,在前补上一个0.

4. flag

MD5 在線免費解密 MD5、SHA1、MySQL、NTLM、SHA256、SHA512、Wordpress、Bcrypt 的雜湊

 在网站上将每条命令并接解密,即可得出flag

831daa3c843ba8b087c895f0ed305ce7 MD5 : ALEXC
6722f7a07246c6af20662b855846c2c8 MD5 : TF{dv
5f04850fec81a27ab5fc98befa4eb40c MD5 : 5d4s2
ecf8dcac7503e63a6a3667c5fb94f610 MD5 : vj8nk
c0fd15ae2c3931bc1e140523ae934722 MD5 : 43s8d
569f606fd6da5d612f10cfb95c0bde6d MD5 : 8l6m1
068cb5a1cf54c078bf0e7e89584c1a4e MD5 : n5l67
c11e2cd82d1f9fbd7e4d6ee9581ff3bd MD5 : ds9v4
1df4c637d625313720f45706a48ff20f MD5 : 1n52n
3122ef3a001aaecdb8dd9d843c029e06 MD5 : v37j4
adb778a0f729293e7e0b19b96a4c5a61 MD5 : 81h3d
938c747c6a051b3e163eb802a325148e MD5 : 28n4b
38543c5e820dd9403b57beff6020596d MD5 : 6v3k}

 flag为:ALEXCTF{dv5d4s2vj8nk43s8d8l6m1n5l67ds9v41n52nv37j481h3d28n4b6v3k}

 5.总结:

遇到题目文件是pyc的文件扩展名,直接放到在线的pyc反编译网站中得到源码,再对源码去逆向分析即可。

主要是熟悉Python反编译的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值