没时间作,只作了一道题。不过有时间估计也是只作这一个题。

题目看上去很简单:

  1. 选过一个proof就是爆破一个sha256,4个字节
  2. 生成17字节的随机数,后边的东西就都是自己输入的了
  3. 输入p(头部为随机数),e,data
  4. 由data生成sha384,唯一的要求:
    pow(int(data, 16), E, P) == int(sha384(data).hexdigest(), 16) % P

    由于sha384不能逆,所以也就别想这东西了。

#!/usr/bin/env python3import random
import signal
import socketserver
import string
from Crypto.Util.number import *
from hashlib import sha256, sha384
from os import urandom
from secret import flagLEN = 17class Task(socketserver.BaseRequestHandler):def __init__(self, *args, **kargs):super().__init__(*args, **kargs)def proof_of_work(self):random.seed(urandom(8))proof = ''.join([random.choice(string.ascii_letters + string.digits + '!#$%&*-?') for _ in range(20)])digest = sha256(proof.encode()).hexdigest()self.dosend('sha256(XXXX + {}) == {}'.format(proof[4: ], digest))self.dosend('Give me XXXX:')x = self.request.recv(10)x = (x.strip()).decode('utf-8') if len(x) != 4 or sha256((x + proof[4: ]).encode()).hexdigest() != digest: return Falsereturn Truedef dosend(self, msg):try:self.request.sendall(msg.encode('latin-1') + b'\n')except:passdef timeout_handler(self, signum, frame):raise TimeoutErrordef recv_fromhex(self, l):passwd = self.request.recv(l).strip()passwd = bytes.fromhex(passwd.decode('latin-1'))return passwd       def handle(self):try:signal.signal(signal.SIGALRM, self.timeout_handler)signal.alarm(50)if not self.proof_of_work():self.dosend('You must pass the PoW!')returnsignal.alarm(60)magic = urandom(LEN)magic_num = bytes_to_long(magic)self.dosend(magic.hex())self.dosend('P:>')P = int(self.request.recv(100).strip(), 16)self.dosend('E:>')E = int(self.request.recv(100).strip(), 16)self.dosend('data:>')data = self.request.recv(100).strip()num1 = int(data, 16)if P >> (384 - LEN * 8) == magic_num and isPrime(P):data2 = sha384(data).hexdigest()num2 = int(data2, 16)if pow(num1, E, P) == num2 % P:self.dosend(flag)else:self.dosend('try harder!!!')except TimeoutError:self.dosend('Timeout!')self.request.close()except:self.dosend('Wtf?')self.request.close()class ThreadedServer(socketserver.ForkingMixIn, socketserver.TCPServer):passif __name__ == "__main__":HOST, PORT = '0.0.0.0', 15555server = ThreadedServer((HOST, PORT), Task)server.allow_reuse_address = Trueserver.serve_forever()

最可恶的就是有时间限制:60秒。

由于sha384不能逆,所以data也就基本是定值了,可以操作的就是P和E,实际上就是求离散对数。由于有时间限制,就要想办法弄个数可以很容易的求出离散对数。

离散对数的安全性要求P-1的最大素因子足够大,所以解这个题就要爆破一个最大素因子很小的P-1。又由于头部固定,我的P爆破从邻接头部后边爆破,这样P-1后尾部全是2可以快速缩小。

#sagemath
def aaa(p0):c = int(sha384(b'11').hexdigest(), 16)p0 = p0<<(384-17*8)for i in range(0x10000):tp = p0 + (i<<(384-17*8 - 16)) + 1if is_prime(tp):l = int(factor(tp-1)[-1][0]).bit_length()if l<48:print('p = ', hex(tp)[2:])print('e = ', hex(int(discrete_log(mod(c,tp),mod(17,tp))))returnaaa(0x46b3d5cb67ecabdd14ed8997f372d4e911)

然后组装就有个问题了,我机子上sage和pwntools组合不上,只能先把取得的东西放sage运算再把结果复制回去。经过几次手抖的过程后终于解决。

from pwn import *
from Crypto.Util.number import *
from hashlib import sha256, sha384
import string def proof(tail, s):tab = string.ascii_letters + string.digits + '!#$%&*-?'for i in tab:for j in tab:for k in tab:for l in tab:msg = i+j+k+l+tailr = sha256(msg.encode()).hexdigest() if r == s:print(" "+i+j+k+l)return i+j+k+l                       p = remote('202.120.7.219', 15555)
context.log_level = 'debug''''
sha256(XXXX + Q6quUUnOKw693Z*k) == 8c0452ca7ca220652104d4bd0dd72f6fc25f0bee622b9b3f53c97741b52bfcd6
Give me XXXX:
'''
p.recvuntil(b'sha256(XXXX + ')
tail = p.recvuntil(b') == ', drop=True).decode()
s = p.recvuntil(b'\n', drop=True).decode()
m = proof(tail, s)
p.sendlineafter(b'Give me XXXX:\n', m.encode())#b'1adb38ceb59d18365bc9aa199955af2da1\n'
data = p.recvline()[:-1]
print(data)
p0 = int(data, 16)print('p0 = ', hex(p0))sp = input("P:")
p.sendlineafter(b'P:>\n', sp)se = input("E:")
p.sendlineafter(b'E:>\n', se)p.sendlineafter(b'data:>\n', b'11') #0x11 = 17p.interactive()

另外,由于要运算离散对数,g不能大,一般如果没特殊情况可以取2,但是2,3经常会有无法求解的情况(含因子)所以这里用的17,其实3有时候也行。最大因子当然越小越好,但太小不容易遇到测试两次后发现一个44位的,就随便写了48,因为这块也需要节省时间。

最后看看交互的过程:

$ py a.py
[+] Opening connection to 202.120.7.219 on port 15555: Done
[DEBUG] Received 0x64 bytes:b'sha256(XXXX + cRZm&a!8X3i$28YJ) == b23f429bace252093acf4b3ab0d059fa8a52102e30cb495e7b912560903209a9\n'
[DEBUG] Received 0xe bytes:b'Give me XXXX:\n'
[DEBUG] Sent 0x5 bytes:b'C6u7\n'
[DEBUG] Received 0x23 bytes:b'779d13f0f1ffda1735928284fd3f240801\n'
[DEBUG] Received 0x4 bytes:b'P:>\n'
[DEBUG] Sent 0x62 bytes:b'779d13f0f1ffda1735928284fd3f24080111790000000000000000000000000000000000000000000000000000000001\n'b'\n'
[DEBUG] Received 0x4 bytes:b'E:>\n'
[DEBUG] Sent 0x61 bytes:b'3fb7c5754190aa6425ba81af4b68a09154d708572f7491c56999fdae75a7787e83a90409311c2f7502c0779ebfb5e98\n'b'\n'
[DEBUG] Received 0x7 bytes:b'data:>\n'
[DEBUG] Sent 0x3 bytes:b'11\n'
[*] Switching to interactive mode
[DEBUG] Received 0x31 bytes:b'flag{Hope_you_can_solve_by_smoothness_this_time}\n'
flag{Hope_you_can_solve_by_smoothness_this_time}

[0CTF/TCTF 2022] real_magic_dlog相关推荐

  1. 0CTF/TCTF 2021 Quals_Misc_singer

    下载附件:点击下载 密码:Le1a 打开附件得到一个文本文件 从Csome-Official师傅的文章中得知,其文本内容除了-和,外,其他的是简谱音名 想用FL Studio将这些音谱填上去来着,但是 ...

  2. Javaweb安全——Dubbo 反序列化(一)

    Dubbo 反序列化(一) Dubbo 基础 Apache Dubbo 是一款 RPC 服务开发框架.提供三个核心功能:面向接口的远程方法调用.智能容错和负载均衡,以及服务自动注册和发现. 节点角色 ...

  3. 第七届XCTF国际网络攻防联赛总决赛战队巡礼!

    Super Guesser国际联合战队创建于2020年,成立伊始便在HITCON.SECCON.Dragon CTF等大型国际CTF赛事中大放异彩,接连斩获赛事冠军.2021年,Super Guess ...

  4. 时序数据取样方法_数据科学的抽样方法

    时序数据取样方法 语境 (Context) In most studies, it is pretty hard (or sometimes impossible) to analyse a whol ...

  5. 腾讯信息安全争霸赛的第四年:喝水人和挖井人

    腾讯信息安全争霸赛(TCTF)的诞生,是一个"出道即巅峰"的故事. 2017年,腾讯安全发起.腾讯安全联合实验室主办的第一届腾讯信息安全争霸赛,没有经历"冷启动" ...

  6. MIPS架构下的逆向初探

    0x00 前言 本人是新接触mips下的逆向,本文参考了网上众多大佬的文章,权当是个人的学习总结,如有问题还请斧正. 本文主要是借助4道ctf里的题目来阐述. 参考文章: https://blog.c ...

  7. 赛宁网安-r3kapig联合战队冲击DEF CON CTF 2022总决赛

    1993年,DEF CON黑客大会正式创办,第一届DEF CON CTF则始于1996年,是全球同类赛事中最具影响力的赛事之一,在圈内有着"黑客世界杯"的美誉. DEF CON C ...

  8. 2022年新能源汽车产业集群百人会

    2022年新能源汽车产业集群百人会   3月25日-3月27日,2022年第八届中国电动汽车百人会(以下简称百人会)在线上举办.本届论坛以"迎接新能源汽车市场化发展新阶段"为主题. ...

  9. 2022年AI芯片场景

    2022年AI芯片场景 随着技术成熟化,AI芯片的应用场景除了在云端及大数据中心,也会随着算力逐渐向边缘端移动,部署于智能家居.智能制造.智慧金融等领 域:同时还将随着智能产品种类日渐丰富,部署于智能 ...

最新文章

  1. React 事件 4
  2. pandas使用duplicated函数删除dataframe中重复列名称的数据列、默认保留重复数据列中的第一个数据列(removing duplicate columns in dataframe)
  3. MySQL数据库-理论基础
  4. HTTP协议详解【转】
  5. 获取分组后取某字段最大一条记录(求每个类别中最大的值的列表)
  6. 第一次作业:艰难的计算机之路
  7. r语言将百分数化为小数_C语言入门学习(一)
  8. 仿小黄车android定位,小黄车ofo是怎么实现自行车定位功能的?
  9. Java 集合容器篇面试题(上)-王者笔记《收藏版》
  10. Eclipse ,Ant编译 jbpm.war包
  11. 什么是 Caché?
  12. 浅谈计算机是如何工作的及Linux下的简单反汇编操作
  13. 当想给下一个请求发送同享的数据时候 可以使用域对象设置属性
  14. Inventor Pro v2008
  15. 计算机操作系统第一章测试题及答案
  16. OceanBase架构浅析_OceanBase分布式数据库
  17. 深入boot.img格式文件结构解析
  18. 最近在搞TAM TIM
  19. 在网页中点击链接就可以和在线好友QQ聊天
  20. Gradle脚本小总结

热门文章

  1. python自动化部署_Python特战班-企业级自动化项目全程部署实战课程 Python高级自动化开发项目课程...
  2. wally魔盒历险记
  3. 回首向来萧瑟处 归去 也无风雨也无晴
  4. 深度学习: 从理论到实践的挑战与前景
  5. 解决 java BufferedReader.readLine()方法按行读取文件内容中文乱码的问题
  6. arcgis10常见问题
  7. 《Sibelius 脚本程序设计》连载(二十七) - 3.1 自定义数据
  8. 简析Instagram的搜索架构
  9. python类的继承优缺点_python 类的三大特性--继承
  10. 0422 寻找数学口袋精灵BUG