ASISCTF

2023-05-16

warm up

题目代码如下图所示,我们会发现整个加密过程如下所示,先在flag后面加上p长度的随机字符,然后选择pow(s,i,p)的结果选择字符重新连接字符串实现加密

#!/usr/bin/env python3

from Crypto.Util.number import *
import string
from secret import is_valid, flag

def random_str(l):
	rstr = ''
	for _ in range(l):
		rstr += string.printable[:94][getRandomRange(0, 93)]
	return rstr

def encrypt(msg, nbit):
	l, p = len(msg), getPrime(nbit)
	rstr = random_str(p - l)
	msg += rstr
	while True:
		s = getRandomNBitInteger(1024)
		if is_valid(s, p):
			break
	enc = msg[0]
	for i in range(p-1):
		enc += msg[pow(s, i, p)]
	return enc

nbit = 15
enc = encrypt(flag, nbit)
print(f'enc = {enc}')

我们发现pow(s,i,p)=2,那么pow(s,2*i,p)=4,所以如果相差一倍的位置上的字符是I和{,我们可以确定i,2*i,从而对s求解,当算出s后即将源字符串还原。由于s和p较小,可以使用爆破s的方式,发现还原字符串开头为ASIS{且flag为规定字符即可找到s和答案

import gmpy2
import string
quanbu=string.ascii_letters + string.digits+"_-]+.!?|"
f=open("output.txt","r")
enc=f.read()
f.close()
enc=enc[7:]
p=len(enc)+1
print(p)

for i in range(len(enc)):
	if enc[i]=="I" and enc[(2*i)%(p-1)]=="{":
		print(i)


i=10778//2
#i=3758//2
ini=gmpy2.invert(i,p-1)
s2=pow(2,ini,p)


s=[]
for zhong in range(p):
	zhongjian=pow(zhong,2,p)
	if zhongjian==s2:
		s.append(zhong)
print(s)


flag=["A"]*p
for j in range(p-1):
	ms=pow(s[0],j,p)
	flag[ms]=enc[j]
if flag[1]=="S" and flag[2]=="I" and flag[3]=="S" and flag[4]=="{":
	print(flag[:30])


flag=["A"]*p
for j in range(p-1):
	ms=pow(s[1],j,p)
	flag[ms]=enc[j]
if flag[1]=="S" and flag[2]=="I" and flag[3]=="S" and flag[4]=="{":
	print(flag[:30])

Spiritual

题目给了nc的接口,其中给出椭圆曲线的p和椭圆曲线的阶,计算当模p^k的时候椭圆曲线的阶是多少。我们发现在sage中椭圆曲线函数有一个extension_degree函数可以快速计算这样的问题,但我们并不知道椭圆曲线的参数,无法还原椭圆曲线,所以我们借助set_order函数强行赋值给椭圆曲线阶,从而完成后面的计算

p = 126479891943345541230373341807457340927

k = 126479891943345541240647426557172181202

n=7

E = EllipticCurve(GF(p),[10000,10000])
E.set_order(k,num_checks=0)
print(E.order(extension_degree=n))

Madras

题目如下,给出一组方程结果,求解方程后即可使用RSA通用求解方式计算

#!/usr/bin/env python3

from Crypto.Util.number import *
from flag import FLAG

def gentuple(nbit):
	a, b, c = [getPrime(nbit // 3) for _ in '012']
	return a, b, c

def encrypt(msg, params):
	a, b, c = params
	e, n = 65537, a * b * c
	m = bytes_to_long(msg)
	assert m < n
	enc = pow(m, e, n)
	return enc

nbit = 513
a, b, c = gentuple(nbit)
enc = encrypt(FLAG, (a, b, c))

print(f'a*b + c = {a*b + c}')
print(f'b*c + a = {b*c + a}')
print(f'c*a + b = {c*a + b}')
print(f'enc % a = {enc % a}')
print(f'enc % b = {enc % b}')
print(f'enc % c = {enc % c}')
print(f'enc     = {enc}')

这里我们使用sage做求解,再解RSA

n1=4553352994596121904719118095314305574744898996748617662645730434291671964711800262656927311612741715902
n2=4414187148384348278031172865715942397786003125047353436418952679980677617016484927045195450392723110402
n3=2621331497797998680087841425011881226283342008022511638116013676175393387095787512291008541271355772802
a, b, c = var('a b c')
print(solve([a*b+c-n1,b*c+a-n2,c*a+b-n3],a,b,c))
import gmpy2
a = 1644376501336761869533914527999140316946467005479211
b = 2769045283056871559108237639832652911114008081576651
c = 1594118801665580510615541222527591707834932058213541
n1 = 4553352994596121904719118095314305574744898996748617662645730434291671964711800262656927311612741715902
n2 = 4414187148384348278031172865715942397786003125047353436418952679980677617016484927045195450392723110402
n3 = 2621331497797998680087841425011881226283342008022511638116013676175393387095787512291008541271355772802
n4 = 1235691098253903868470929520042453631250042769029968
n5 = 2235727505835415157472856687960365216626058343546572
n6 = 1197976933648163722609601772402895844093866589777721
enc     = 6238548897897912462708514382106387305984378113132192980353695746912882399991285268937548949835500837749446265632471076030233510866260067177632747513323223

assert a*b+c==n1
assert b*c+a==n2
assert c*a+b==n3
assert enc%a==n4
assert enc%b==n5
assert enc%c==n6

print(gmpy2.is_prime(a))
print(gmpy2.is_prime(b))
print(gmpy2.is_prime(c))
n=a*b*c
phi=(a-1)*(b-1)*(c-1)
e=65537
d=gmpy2.invert(e,phi)
m=pow(enc,d,n)
print(hex(m)[2:].decode("hex"))

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASISCTF 的相关文章

随机推荐

  • 续集来了!我让 GPT-4 用 Laf 三分钟写了个完整的待办事项 App

    书接前文 xff0c 上篇文章我们教大家如何三分钟时间用 Laf 实现一个自己的 ChatGPT 一觉醒来 xff0c GPT 4 已经发布了 xff01 GPT 4 实现了真正的多模态 xff0c 可以把纸笔画的原型直接写出网页代码 读论
  • 【EtherCAT理论篇】二、EtherCAT工作原理

    1 EtherCAT系统组成 EtherCAT是一种实时以太网技术 xff0c 由一个主站设备和多个从站设备组成 主站设备使用标准的以太网控制器 xff0c 具有良好的兼容性 xff0c 任何具有网络接口卡的计算机和具有以太网控制的嵌入式设
  • 【EtherCAT分析】一、EtherCAT从站硬件分析

    1 EtherCAT从站控制芯片 EtherCAT从站控制芯片ESC是实现EtherCAT数据链路层协议的核心 xff0c 它处理EtherCAT数据帧 xff0c 并提供数据接口 从站控制器通常都有一个内部的DPRAM xff0c 并提供
  • 【EtherCAT实践篇】六、更改XML,增加输入输出变量

    目的 xff1a 在EtherCAT开发板上IO程序 xff08 基于SSC的IO通讯 xff09 基础上进行修改 xff0c 实现16路拨码开关输入 xff0c 以及16路LED输出 EtherCAT从站增加变量的操作包括两个部分 xff
  • 【SOEM主站】一、SOEM主站环境搭建及连接板子测试

    目的 xff1a 在windows环境下搭建SOEM主站 xff0c 并利用SOEM自带例程测试EtherCAT板子从站板通讯效果 1 SOEM主站环境搭建 xff08 1 xff09 安装VS xff1a 我这里安装的是VS2017 xf
  • 【EtherCAT实践篇】七、更改XML示例2,增加16位模拟输入

    目的 xff1a 在EtherCAT开发板上IO程序基础上增加一个16位的变量mytest xff0c 用于传输模拟量发送给主站 1 EtherCAT增加变量说明 在实际使用中 xff0c 可现有程序的输入输出变量可能不能直接满足实际需求
  • 【EtherCAT实践篇】八、更改XML示例3,增加16位模拟DAC输出

    目的 xff1a 在EtherCAT开发板上IO程序 xff08 基本IO通讯 基于SSC xff09 基础上进行修改 xff0c 增加一路模拟量输出 xff0c 并输出给DAC管脚 由于STM32F405底板具有DAC输出功能 xff0c
  • Pixhawk固件PX4之串口通讯

    1 目的 为进一步扩展pixhawk的接口及功能 xff0c 通过pixhawk现有接口 xff08 串口 I2C等 xff09 连接外部设备来实现 xff0c 本节内容主要介绍串口通讯方式 2 测试平台 硬件 xff1a pixhawk
  • 手机充电原理分析及问题总结

    xff08 1 xff09 充电流程介绍 xff1a 当充电器插入时 xff0c 亦即为PMIC充电模块提供了Vcharge电压 xff0c 这时会产生一个充电中断信号到CPU xff0c 通知CPU现在已经进入充电状态 CPU开始启动如下
  • 串口接收不定长数据的几种方法

    串口作为单片机开发的一个常用的外设 xff0c 应用范围非常广 大部分时候 xff0c 串口需要接收处理的数据长度是不定的 那么怎么才能判断一帧数据是否结束呢 xff0c 今天就以STM32单片机为例 xff0c 介绍几种接收不定长数据的方
  • 删除分节符的技巧

    WORD中删除分节符有这样的规定 xff1a 如果要删除分节符 xff0c 只要把光标移动到该分节符上 xff0c 按Delete键即可 但是要注意该分节符前面的文字将合并到后面的节中 xff0c 并且采用后者的格式设置 我就不知道天杀的微
  • 虚机创建异常报错No valid host was found,There are not enough hosts available

    虚机创建异常 xff0c 使用nova show 虚机ID提示fault报错信息 xff1a No valid host was found xff0c There are not enough hosts available 检查所在宿主
  • vuzzer 具体原理解析

    目录 1 安装 vmware 15 01环境下安装 xff1a 2 vuzzer使用说明 3 vuzzer原理 3 1权重文件以及有着cmp信息的文件生成 3 2 vuzzer种子生成 xff0c 变异原理 3 2 1 runfuzz py
  • C++ unordered_set

    目录 1 定义 2 基本的函数 2 1 unordered set构造 2 2 添加新的元素 注意无法插入相同元素 2 3 查找元素 2 4 查找桶接口 2 5 观察器 2 6 清除元素 2 7 其他函数 1 定义 unordered se
  • clang 10 介绍——sanitizerCoverage

    1 Introduction llvm内置了一个简单的代码覆盖率检测 xff08 sanitizercoverage xff09 它在函数级 基本块级和边缘级插入对用户定义函数的调用 提供了这些回调的默认实现 xff0c 并实现了简单的覆盖
  • C++ 匿名函数

    1 定义 所谓匿名函数 xff0c 其实类似于python中的lambda函数 xff0c 其实就是没有名字的函数 使用匿名函数 xff0c 可以免去函数的声明和定义 这样匿名函数仅在调用函数的时候才会创建函数对象 xff0c 而调用结束后
  • 给docker中的ubuntu系统安装桌面程序

    原本服务器是centos的 xff0c 用的不是很习惯 xff0c 也为了可以分割功能 xff0c 于是在服务器上装了docker xff0c docker里装了ubuntu系统 xff0c 具体过程可以参见https blog csdn
  • 陇剑杯 2021 write up整理

    竞赛 write up 收集和整理 陇剑杯 2021 write up整理1 签到题1 1 2 JWT2 12 22 32 42 52 6 3 webshell3 13 23 33 43 53 63 7 4 日志分析4 14 24 3 5
  • PBCTF2021

    PBCTF2021 1 MISC1 1 幽灵作家 Ghost Writer 2 Crypto2 1 Alkaloid Stream2 2 Steroid Stream2 3 good hash 1 MISC 1 1 幽灵作家 Ghost W
  • ASISCTF

    warm up 题目代码如下图所示 xff0c 我们会发现整个加密过程如下所示 xff0c 先在flag后面加上p长度的随机字符 xff0c 然后选择pow s i p 的结果选择字符重新连接字符串实现加密 usr bin env pyth