IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 攻防世界逆向高手题之re4-unvm-me -> 正文阅读

[Python知识库]攻防世界逆向高手题之re4-unvm-me

攻防世界逆向高手题之re4-unvm-me

继续开启全栈梦想之逆向之旅~
这题是攻防世界逆向高手题的re4-unvm-me
在这里插入图片描述

下载附件,是.pyc文件,用在线网站反编译:

https://tool.lu/pyc/

#!/usr/bin/env python
# visit https://tool.lu/pyc/ for more information
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://www.somd5.com/batch.html

(这里积累第二个经验)
这里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位密文,所以多一位或少一位就完全对不上了。

解毕!敬礼!

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-09-07 10:46:22  更:2021-09-07 10:47:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/27 14:00:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计