BUUCTF Reverse/[羊城杯 2020]login(python程序)

news/2024/5/19 22:54:35 标签: python, CTF, buuctf

查看信息,python文件

在这里插入图片描述

动调了一下,该程序创建了一个线程来读入数据,而这个线程的代码应该是放在内存中直接执行的,本地看不到代码,很蛋疼

查了下可以用PyInstaller Extractor工具来解包,可以参考这个Python解包及反编译: PyInstaller Extractor+uncompyle6

在这里插入图片描述

解码完成后用16进制编辑器打开,如010,将login.pyc中的第一行替换为struct.pyc的第一行,然后找个在线pyc反编译

python">#! /usr/bin/env python 3.6 (3379)
#coding=utf-8
# Compiled at: 1995-09-27 11:18:56
#Powered by BugScaner
#http://tools.bugscaner.com/
#如果觉得不错,请分享给你朋友使用吧!
import sys
input1 = input('input something:')
if len(input1) != 14:
    print('Wrong length!')
    sys.exit()
code = []
for i in range(13):
    code.append(ord(input1[i]) ^ ord(input1[i + 1]))
 
code.append(ord(input1[13]))
a1 = code[2]
a2 = code[1]
a3 = code[0]
a4 = code[3]
a5 = code[4]
a6 = code[5]
a7 = code[6]
a8 = code[7]
a9 = code[9]
a10 = code[8]
a11 = code[10]
a12 = code[11]
a13 = code[12]
a14 = code[13]
if (a1 * 88 + a2 * 67 + a3 * 65 - a4 * 5 + a5 * 43 + a6 * 89 + a7 * 25 + a8 * 13 - a9 * 36 + a10 * 15 + a11 * 11 + a12 * 47 - a13 * 60 + a14 * 29 == 22748) & (a1 * 89 + a2 * 7 + a3 * 12 - a4 * 25 + a5 * 41 + a6 * 23 + a7 * 20 - a8 * 66 + a9 * 31 + a10 * 8 + a11 * 2 - a12 * 41 - a13 * 39 + a14 * 17 == 7258) & (a1 * 28 + a2 * 35 + a3 * 16 - a4 * 65 + a5 * 53 + a6 * 39 + a7 * 27 + a8 * 15 - a9 * 33 + a10 * 13 + a11 * 101 + a12 * 90 - a13 * 34 + a14 * 23 == 26190) & (a1 * 23 + a2 * 34 + a3 * 35 - a4 * 59 + a5 * 49 + a6 * 81 + a7 * 25 + (a8 << 7) - a9 * 32 + a10 * 75 + a11 * 81 + a12 * 47 - a13 * 60 + a14 * 29 == 37136) & (a1 * 38 + a2 * 97 + a3 * 35 - a4 * 52 + a5 * 42 + a6 * 79 + a7 * 90 + a8 * 23 - a9 * 36 + a10 * 57 + a11 * 81 + a12 * 42 - a13 * 62 - a14 * 11 == 27915) & (a1 * 22 + a2 * 27 + a3 * 35 - a4 * 45 + a5 * 47 + a6 * 49 + a7 * 29 + a8 * 18 - a9 * 26 + a10 * 35 + a11 * 41 + a12 * 40 - a13 * 61 + a14 * 28 == 17298) & (a1 * 12 + a2 * 45 + a3 * 35 - a4 * 9 - a5 * 42 + a6 * 86 + a7 * 23 + a8 * 85 - a9 * 47 + a10 * 34 + a11 * 76 + a12 * 43 - a13 * 44 + a14 * 65 == 19875) & (a1 * 79 + a2 * 62 + a3 * 35 - a4 * 85 + a5 * 33 + a6 * 79 + a7 * 86 + a8 * 14 - a9 * 30 + a10 * 25 + a11 * 11 + a12 * 57 - a13 * 50 - a14 * 9 == 22784) & (a1 * 8 + a2 * 6 + a3 * 64 - a4 * 85 + a5 * 73 + a6 * 29 + a7 * 2 + a8 * 23 - a9 * 36 + a10 * 5 + a11 * 2 + a12 * 47 - a13 * 64 + a14 * 27 == 9710) & (a1 * 67 - a2 * 68 + a3 * 68 - a4 * 51 - a5 * 43 + a6 * 81 + a7 * 22 - a8 * 12 - a9 * 38 + a10 * 75 + a11 * 41 + a12 * 27 - a13 * 52 + a14 * 31 == 13376) & (a1 * 85 + a2 * 63 + a3 * 5 - a4 * 51 + a5 * 44 + a6 * 36 + a7 * 28 + a8 * 15 - a9 * 6 + a10 * 45 + a11 * 31 + a12 * 7 - a13 * 67 + a14 * 78 == 24065) & (a1 * 47 + a2 * 64 + a3 * 66 - a4 * 5 + a5 * 43 + a6 * 112 + a7 * 25 + a8 * 13 - a9 * 35 + a10 * 95 + a11 * 21 + a12 * 43 - a13 * 61 + a14 * 20 == 27687) & (a1 * 89 + a2 * 67 + a3 * 85 - a4 * 25 + a5 * 49 + a6 * 89 + a7 * 23 + a8 * 56 - a9 * 92 + a10 * 14 + a11 * 89 + a12 * 47 - a13 * 61 - a14 * 29 == 29250) & (a1 * 95 + a2 * 34 + a3 * 62 - a4 * 9 - a5 * 43 + a6 * 83 + a7 * 25 + a8 * 12 - a9 * 36 + a10 * 16 + a11 * 51 + a12 * 47 - a13 * 60 - a14 * 24 == 15317):
    print('flag is GWHT{md5(your_input)}')
    print('Congratulations and have fun!')
else:
    print('Sorry,plz try again...')

随便用个word做个替换,将a1-a14替换成code[]这样z3变量命名方便点

替换完成后是这样的

python">code[2] * 88 + code[1] * 67 + code[0] * 65 - code[3] * 5 + code[4] * 43 + code[5] * 89 + code[6] * 25 + code[7] * 13 - code[9] * 36 + code[8] * 15 + code[10] * 11 + code[11] * 47 - code[12] * 60 + code[13] * 29 == 22748
code[2] * 89 + code[1] * 7 + code[0] * 12 - code[3] * 25 + code[4] * 41 + code[5] * 23 + code[6] * 20 - code[7] * 66 + code[9] * 31 + code[8] * 8 + code[10] * 2 - code[11] * 41 - code[12] * 39 + code[13] * 17 == 7258
code[2] * 28 + code[1] * 35 + code[0] * 16 - code[3] * 65 + code[4] * 53 + code[5] * 39 + code[6] * 27 + code[7] * 15 - code[9] * 33 + code[8] * 13 + code[10] * 101 + code[11] * 90 - code[12] * 34 + code[13] * 23 == 26190
code[2] * 23 + code[1] * 34 + code[0] * 35 - code[3] * 59 + code[4] * 49 + code[5] * 81 + code[6] * 25 + (code[7] << 7) - code[9] * 32 + code[8] * 75 + code[10] * 81 + code[11] * 47 - code[12] * 60 + code[13] * 29 == 37136
code[2] * 38 + code[1] * 97 + code[0] * 35 - code[3] * 52 + code[4] * 42 + code[5] * 79 + code[6] * 90 + code[7] * 23 - code[9] * 36 + code[8] * 57 + code[10] * 81 + code[11] * 42 - code[12] * 62 - code[13] * 11 == 27915
code[2] * 22 + code[1] * 27 + code[0] * 35 - code[3] * 45 + code[4] * 47 + code[5] * 49 + code[6] * 29 + code[7] * 18 - code[9] * 26 + code[8] * 35 + code[10] * 41 + code[11] * 40 - code[12] * 61 + code[13] * 28 == 17298
code[2] * 12 + code[1] * 45 + code[0] * 35 - code[3] * 9 - code[4] * 42 + code[5] * 86 + code[6] * 23 + code[7] * 85 - code[9] * 47 + code[8] * 34 + code[10] * 76 + code[11] * 43 - code[12] * 44 + code[13] * 65 == 19875
code[2] * 79 + code[1] * 62 + code[0] * 35 - code[3] * 85 + code[4] * 33 + code[5] * 79 + code[6] * 86 + code[7] * 14 - code[9] * 30 + code[8] * 25 + code[10] * 11 + code[11] * 57 - code[12] * 50 - code[13] * 9 == 22784
code[2] * 8 + code[1] * 6 + code[0] * 64 - code[3] * 85 + code[4] * 73 + code[5] * 29 + code[6] * 2 + code[7] * 23 - code[9] * 36 + code[8] * 5 + code[10] * 2 + code[11] * 47 - code[12] * 64 + code[13] * 27 == 9710
code[2] * 67 - code[1] * 68 + code[0] * 68 - code[3] * 51 - code[4] * 43 + code[5] * 81 + code[6] * 22 - code[7] * 12 - code[9] * 38 + code[8] * 75 + code[10] * 41 + code[11] * 27 - code[12] * 52 + code[13] * 31 == 13376
code[2] * 85 + code[1] * 63 + code[0] * 5 - code[3] * 51 + code[4] * 44 + code[5] * 36 + code[6] * 28 + code[7] * 15 - code[9] * 6 + code[8] * 45 + code[10] * 31 + code[11] * 7 - code[12] * 67 + code[13] * 78 == 24065
code[2] * 47 + code[1] * 64 + code[0] * 66 - code[3] * 5 + code[4] * 43 + code[5] * 112 + code[6] * 25 + code[7] * 13 - code[9] * 35 + code[8] * 95 + code[10] * 21 + code[11] * 43 - code[12] * 61 + code[13] * 20 == 27687
code[2] * 89 + code[1] * 67 + code[0] * 85 - code[3] * 25 + code[4] * 49 + code[5] * 89 + code[6] * 23 + code[7] * 56 - code[9] * 92 + code[8] * 14 + code[10] * 89 + code[11] * 47 - code[12] * 61 - code[13] * 29 == 29250
code[2] * 95 + code[1] * 34 + code[0] * 62 - code[3] * 9 - code[4] * 43 + code[5] * 83 + code[6] * 25 + code[7] * 12 - code[9] * 36 + code[8] * 16 + code[10] * 51 + code[11] * 47 - code[12] * 60 - code[13] * 24 == 15317

解题脚本

python">from z3 import *
import hashlib

s = Solver()

code = [Int((b'code%d'% i)) for i in range(14) ]

s.add(code[2] * 88 + code[1] * 67 + code[0] * 65 - code[3] * 5 + code[4] * 43 + code[5] * 89 + code[6] * 25 + code[7] * 13 - code[9] * 36 + code[8] * 15 + code[10] * 11 + code[11] * 47 - code[12] * 60 + code[13] * 29 == 22748)
s.add(code[2] * 89 + code[1] * 7 + code[0] * 12 - code[3] * 25 + code[4] * 41 + code[5] * 23 + code[6] * 20 - code[7] * 66 + code[9] * 31 + code[8] * 8 + code[10] * 2 - code[11] * 41 - code[12] * 39 + code[13] * 17 == 7258)
s.add(code[2] * 28 + code[1] * 35 + code[0] * 16 - code[3] * 65 + code[4] * 53 + code[5] * 39 + code[6] * 27 + code[7] * 15 - code[9] * 33 + code[8] * 13 + code[10] * 101 + code[11] * 90 - code[12] * 34 + code[13] * 23 == 26190)
s.add(code[2] * 23 + code[1] * 34 + code[0] * 35 - code[3] * 59 + code[4] * 49 + code[5] * 81 + code[6] * 25 + (code[7] * 128) - code[9] * 32 + code[8] * 75 + code[10] * 81 + code[11] * 47 - code[12] * 60 + code[13] * 29 == 37136)
s.add(code[2] * 38 + code[1] * 97 + code[0] * 35 - code[3] * 52 + code[4] * 42 + code[5] * 79 + code[6] * 90 + code[7] * 23 - code[9] * 36 + code[8] * 57 + code[10] * 81 + code[11] * 42 - code[12] * 62 - code[13] * 11 == 27915)
s.add(code[2] * 22 + code[1] * 27 + code[0] * 35 - code[3] * 45 + code[4] * 47 + code[5] * 49 + code[6] * 29 + code[7] * 18 - code[9] * 26 + code[8] * 35 + code[10] * 41 + code[11] * 40 - code[12] * 61 + code[13] * 28 == 17298)
s.add(code[2] * 12 + code[1] * 45 + code[0] * 35 - code[3] * 9 - code[4] * 42 + code[5] * 86 + code[6] * 23 + code[7] * 85 - code[9] * 47 + code[8] * 34 + code[10] * 76 + code[11] * 43 - code[12] * 44 + code[13] * 65 == 19875)
s.add(code[2] * 79 + code[1] * 62 + code[0] * 35 - code[3] * 85 + code[4] * 33 + code[5] * 79 + code[6] * 86 + code[7] * 14 - code[9] * 30 + code[8] * 25 + code[10] * 11 + code[11] * 57 - code[12] * 50 - code[13] * 9 == 22784)
s.add(code[2] * 8 + code[1] * 6 + code[0] * 64 - code[3] * 85 + code[4] * 73 + code[5] * 29 + code[6] * 2 + code[7] * 23 - code[9] * 36 + code[8] * 5 + code[10] * 2 + code[11] * 47 - code[12] * 64 + code[13] * 27 == 9710)
s.add(code[2] * 67 - code[1] * 68 + code[0] * 68 - code[3] * 51 - code[4] * 43 + code[5] * 81 + code[6] * 22 - code[7] * 12 - code[9] * 38 + code[8] * 75 + code[10] * 41 + code[11] * 27 - code[12] * 52 + code[13] * 31 == 13376)
s.add(code[2] * 85 + code[1] * 63 + code[0] * 5 - code[3] * 51 + code[4] * 44 + code[5] * 36 + code[6] * 28 + code[7] * 15 - code[9] * 6 + code[8] * 45 + code[10] * 31 + code[11] * 7 - code[12] * 67 + code[13] * 78 == 24065)
s.add(code[2] * 47 + code[1] * 64 + code[0] * 66 - code[3] * 5 + code[4] * 43 + code[5] * 112 + code[6] * 25 + code[7] * 13 - code[9] * 35 + code[8] * 95 + code[10] * 21 + code[11] * 43 - code[12] * 61 + code[13] * 20 == 27687)
s.add(code[2] * 89 + code[1] * 67 + code[0] * 85 - code[3] * 25 + code[4] * 49 + code[5] * 89 + code[6] * 23 + code[7] * 56 - code[9] * 92 + code[8] * 14 + code[10] * 89 + code[11] * 47 - code[12] * 61 - code[13] * 29 == 29250)
s.add(code[2] * 95 + code[1] * 34 + code[0] * 62 - code[3] * 9 - code[4] * 43 + code[5] * 83 + code[6] * 25 + code[7] * 12 - code[9] * 36 + code[8] * 16 + code[10] * 51 + code[11] * 47 - code[12] * 60 - code[13] * 24 == 15317)

s.check()
m = s.model()
flag = [int(str(m[code[i]])) for i in range(14)]

print(flag)

for i in range(12,-1,-1):
    flag[i] = flag[i] ^ flag[i+1]

for i in range(14):
    print(chr(flag[i]),end='')

print(hashlib.md5(bytes(flag)).hexdigest())


结果,最终flag: flag{58964088b637e50d3a22b9510c1d1ef8}

python">[10, 24, 119, 7, 104, 43, 28, 91, 108, 52, 88, 74, 88, 33]
U_G07_th3_k3y!58964088b637e50d3a22b9510c1d1ef8

http://www.niftyadmin.cn/n/5020455.html

相关文章

Linux之shell条件测试

目录 作用 基本用法 格式&#xff1a; 案例 -f 用法 [ ] 用法 [[]] 用法 (()) 语法 文件测试 参数 案例 编写脚本&#xff0c;测试文件是否存在&#xff0c;不存在则创建 整数测试 作用 操作符 案例 系统用户个数小于50的则输出信息 逻辑操作符 符号 案例 …

【HELLO NEW WORLD】一封来自开放自动化时代的邀请函

​ 施耐德电气开放自动化平台&#xff0c;迈向开放、高效与韧性、可持续、以人为本的未来工业。 HELLO WORLD 是人类在信息世界开启的第一行 也是我们走进自动化领域迎来的第一句问候 如今 面临向数字化与自动化加速转型的新变局 工业领域迫切地需要一场变革 走向更加高效…

sql注入的数据提交方式和查询方式

死在山野的风里&#xff0c;活在自由的梦里 sql注入的数据提交方式和查询方式 数据提交方式GET方式注入POST方式注入Request方式注入HTTP头注入什么是Header头部注入&#xff1f;cookie注入 查询方式 数据提交方式 GET方式注入 get注入方式比较常见&#xff0c;主要是通过ur…

记一次线程堵塞(挂起)导致消息队列积压

1 背景 A服务作为生产者&#xff0c;每天发送上千万的mq消息&#xff0c;每一个消息包含500个用户ids数据。B服务作为消费者&#xff0c;接受MQ消息并通过http调用第三方请求进行业务处理&#xff0c;消费组启用了rabbitmq的多线程消费组&#xff0c;一个实例并发40个mq消费者…

How Language Model Hallucinations Can Snowball

本文是LLM系列文章&#xff0c;针对《How Language Model Hallucinations Can Snowball》的翻译。 语言模型幻觉是如何产生雪球的 摘要1 引言2 为什么我们期待幻觉像滚雪球一样越滚越大&#xff1f;3 实验4 我们能防止雪球幻觉吗&#xff1f;5 相关工作6 结论局限性 摘要 在实…

思科的简易配置

vlan 划分配置 1. 拓扑连接 2. 终端设备配置&#xff0c;vlan(v2, v3)配置&#xff0c;模式设置 然后设置交换机 fa 0/5 口为 trunk 模式&#xff0c;使得不同交换机同一 vlan 下 PC 可以互连 3.测试配置结果 用 ip 地址为 192.168.1.1 的主机(PC0)向同一 vlan(v2)下的 192.…

uniapp-历史搜索记录

应用场景 很多搜索场景内都能用到这个功能 大概就是用户搜索了某个关键字 然后搜索的关键字可以持久的保存下来 下次打开搜索的时候可以达到快速点击搜索的效果 实现步骤 1. 先给输入框双向绑定数据和事件 <input v-model"keyWord"> 2. 给搜索按钮绑定点…

第九章:Java常用类

9.1&#xff1a;字符串相关的类&#xff1a;String String是一个final类&#xff0c;代表不可变的字符序列 9.1.1&#xff1a;String用法 package com.jiayifeng.java1;import org.junit.Test;/*** author xiaojia* create 2023-09-11 8:09** 快捷键&#xff1a;alt shift …