• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
M1nercy
博客园    首页    新随笔    联系   管理    订阅  订阅
2021.03.26_Reverse_xCTF_re4-unvm-me_WriteUp

第二次见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进行分段并取摘要,把摘要再加密一次才是给我们的密文,感觉收获不少。

posted on 2021-03-26 20:34  M1nercy  阅读(181)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3