【Sword系列】第七届全国残疾人职业技能大赛样题-网络安全-lsb-oracle

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 在密码学中,预言机被定义为某种“黑匣子”机制,它将泄漏有关输入上的加密操作的一些信息。对于特定输入,预言机的输出始终相同。因此,预言机可用于逐个了解明文,包括完整的明文恢复。

前言

在密码学中,预言机被定义为某种“黑匣子”机制,它将泄漏有关输入上的加密操作的一些信息。对于特定输入,预言机的输出始终相同。因此,预言机可用于逐个了解明文,包括完整的明文恢复。

在我们的例子中,我们有一个LSB预言机。在这种情况下,对于每个输入密文,预言机将使用其私钥对其进行解密,然后通知我们解密明文的单个最低有效位。在这种情况下,最低有效位将告诉我们结果数字是奇数还是偶数。这也被称为“奇偶校验侧信道攻击”,我从里卡尔多·福卡尔迪(Riccardo Focardi)的这篇论文中了解到所有内容,你可以在这里阅读。请记住,在RSA数学中,我们的明文和密文只是长整数。我们将它们转换为字符串以对我们有用,但在下面当我谈论明文或密文数学时,我只是指那些长整数的数学。

在这个挑战中,我们的LSB预言机二进制文件将给我们一个如果我们的标志明文是奇数的,如果我们的标志明文是偶数,则给我们一个''。我们可以通过使用我们的公钥加密数字 2(偶数)来确认这一点。

一、lsb-oracle

1.打开题目

image.png

2.解题

2.1 补充缺失文件和包

打开题目得到description.py和lsb_oracle.vmp.exe文件

题目有问题缺少description.py

#! /usr/bin/env python3
from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey import RSA
from Crypto.Util.number import bytes_to_long
n = -1  # get it from the provided EXE file
e = -1  # get it from the provided EXE file
flag = b'' # redacted
key = RSA.construct((n, e))
cipher = PKCS1_v1_5.new(key)
ctxt = bytes_to_long(cipher.encrypt(flag))
print(ctxt)
# output is:
# 2201077887205099886799419505257984908140690335465327695978150425602737431754769971309809434546937184700758848191008699273369652758836177602723960420562062515168299835193154932988833308912059796574355781073624762083196012981428684386588839182461902362533633141657081892129830969230482783192049720588548332813

image.png

linux下需要安装wine来运行exe文件

sudo apt-get install wine

image.png

2.2 破密脚本

solve.py

#!/usr/bin/python
import libnum, decimal
from pwn import *
# from ./lsb_oracle.vmp.exe /pubkey
n = 120357855677795403326899325832599223460081551820351966764960386843755808156627131345464795713923271678835256422889567749230248389850643801263972231981347496433824450373318688699355320061986161918732508402417281836789242987168090513784426195519707785324458125521673657185406738054328228404365636320530340758959
e = 65537
# from description.py
c = 2201077887205099886799419505257984908140690335465327695978150425602737431754769971309809434546937184700758848191008699273369652758836177602723960420562062515168299835193154932988833308912059796574355781073624762083196012981428684386588839182461902362533633141657081892129830969230482783192049720588548332813
# Encrypt the plaintext integer 2
c_of_2 = pow(2,e,n)
# Run the oracle in wine. Works fine. Who needs windows.
p = process(['wine','lsb_oracle.vmp.exe','/decrypt'])
print "[*] Starting wine and LSB Oracle..."
p.recvlines(4)
# Ask the oracle for the LSB of a decryption of c
def oracle(c):
    p.sendline(str(c))
    return int(p.recvlines(2)[0])
# code from http://secgroup.dais.unive.it/wp-content/uploads/2012/11/Practical-Padding-Oracle-Attacks-on-RSA.html 
# by Riccardo Focardi
def partial(c,n):
    k = n.bit_length()
    decimal.getcontext().prec = k    # allows for 'precise enough' floats
    lower = decimal.Decimal(0)
    upper = decimal.Decimal(n)
    for i in range(k):
        possible_plaintext = (lower + upper)/2
        if not oracle(c):
            upper = possible_plaintext            # plaintext is in the lower half
        else:
            lower = possible_plaintext            # plaintext is in the upper half
        c=(c*c_of_2) % n     # multiply y by the encryption of 2 again
    # By now, our plaintext is revealed!
    return int(upper)
print "[*] Conducting Oracle attack..."
print repr(libnum.n2s(partial((c*c_of_2)%n,n)))

2.3 运行解密

使用Wine来执行oracle二进制文件

python solve.py

得到flag:

root@kali:~/sharif16/lsboracle# ./solve.py 
[+] Starting program '/usr/bin/wine': Done
[*] Starting wine and LSB Oracle...
[*] Conducting Oracle attack...
'\x02\xa9\x12\xa7uA\x94\x8e\x8c2\xd5(\xda\x1eq?\xf7\xd0TL\xe8\xde1$\xbf\xe4w\xe1\x18\x12\x1f\xef\x03\x8b{\x7f\xb2\x9c\xa6Bs\xd2\xfe&\xe8+k7\xd8\xe7\xa5\x0b\xaf\xa8R\x12\x93\x0e,\xdfp\xff\x9a\xe7\x9b\xbduN4\x85I\xde3\x07\xb2n\xa4\xdb"\xd5\xfaf\x84\x00SharifCTF{65d7551577a6a613c99c2b4023039b0a}'

备注

windows脚本如下

from subprocess import Popen, PIPE
from Crypto.Util.number import long_to_bytes


def oracle(ciphertext):
    print("sent ciphertext " + str(ciphertext))
    p = Popen(['lsb_oracle.vmp.exe', '/decrypt'], stdout=PIPE, stdin=PIPE, stderr=PIPE)
    result = p.communicate(str(ciphertext) + "\n-1")
    lsb = int(result[0][97])
    print(lsb, result)
    return lsb


def brute_flag(encrypted_flag, n, e, oracle_fun):
    flag_count = n_count = 1
    flag_lower_bound = 0
    flag_upper_bound = n
    ciphertext = encrypted_flag
    mult = 1
    while flag_upper_bound > flag_lower_bound + 1:
        ciphertext = (ciphertext * pow(2, e, n)) % n
        flag_count *= 2
        n_count = n_count * 2 - 1
        print("upper = %d" % flag_upper_bound)
        print("upper flag = %s" % long_to_bytes(flag_upper_bound))
        print("lower = %d" % flag_lower_bound)
        print("lower flag = %s" % long_to_bytes(flag_lower_bound))
        print("bit = %d" % mult)
        mult += 1
        if oracle_fun(ciphertext) == 0:
            flag_upper_bound = n * n_count / flag_count
        else:
            flag_lower_bound = n * n_count / flag_count
            n_count += 1
    return flag_upper_bound


def main():
    n = 120357855677795403326899325832599223460081551820351966764960386843755808156627131345464795713923271678835256422889567749230248389850643801263972231981347496433824450373318688699355320061986161918732508402417281836789242987168090513784426195519707785324458125521673657185406738054328228404365636320530340758959
    ct = 2201077887205099886799419505257984908140690335465327695978150425602737431754769971309809434546937184700758848191008699273369652758836177602723960420562062515168299835193154932988833308912059796574355781073624762083196012981428684386588839182461902362533633141657081892129830969230482783192049720588548332813
    print(long_to_bytes(brute_flag(ct, n, 65537, oracle)))


main()
目录
相关文章
|
11天前
|
网络安全 数据安全/隐私保护 XML
2024“天一永安杯“宁波第七届网络安全大赛极安云科战队部分WP
2024“天一永安杯“宁波第七届网络安全大赛极安云科战队部分WP
2024“天一永安杯“宁波第七届网络安全大赛极安云科战队部分WP
|
11天前
|
安全 关系型数据库 MySQL
2023 金砖国家职业技能大赛网络安全省赛二三阶段样题(金砖国家未来技能挑战赛)
2023 金砖国家职业技能大赛网络安全省赛二三阶段样题(金砖国家未来技能挑战赛)
|
11天前
|
安全 网络协议 网络安全
2023 金砖国家职业技能大赛网络安全省赛理论题样题(金砖国家未来技能挑战赛)
2023 金砖国家职业技能大赛网络安全省赛理论题样题(金砖国家未来技能挑战赛)
|
11天前
|
运维 网络协议 Linux
2023年河南省中等职业教育技能大赛网络建设与运维项目比赛试题(一)
2023年河南省中等职业教育技能大赛网络建设与运维项目比赛试题(一)
|
11天前
|
安全 测试技术 网络安全
2024年甘肃省职业院校技能大赛中职组 “网络安全”赛项竞赛样题-C模块安全事件响应/网络安全数据取证/应用安全
涉及安全事件响应和应用安全测试。需使用Kali对Windows Server2105进行渗透测试,包括服务扫描、DNS信息提取、管理员密码、文件名与内容、图片中单词等。另外,需收集win20230305的服务器端口、页面信息、脚本、登录后信息等。在Linux Server2214上,要获取SSH端口、主机名、内核版本并进行提权操作。网络安全响应针对Server2228,涉及删除后门用户、查找SSH后门时间、恢复环境变量、识别篡改文件格式和矿池钱包地址。最后,对lin20230509进行网站渗透,获取端口号、数据库服务版本、脚本创建时间、页面路径、内核版本和root目录下的flag文件内容
13 0
|
11天前
|
安全 Linux 网络安全
2024年甘肃省职业院校技能大赛中职组 “网络安全”赛项竞赛样题-C模块基础设施设置/安全加固
网络安全模块A要求对Windows和Linux服务器进行安全加固,包括密码策略(最小13字符,复杂性要求)、用户管理(禁止非管理员命令提示符,隐藏登录信息)、Nginx安全配置(限制HTTP请求,设置超时时间,降权启动)、日志监控(设置日志大小和覆盖策略)、中间件服务加固(SSH、VSFTPD、IIS服务优化)、本地安全策略(禁止匿名访问,保护密码存储,控制关机,限制Everyone权限)和防火墙策略(限制SSH连接源,防御DoS,允许特定DNS请求)。所有更改需清晰截图并附说明,保存为PDF,命名规则为“网络安全模块A-XX”并提交至U盘。
11 0
|
11天前
|
安全 测试技术 网络安全
2024年甘肃省职业院校技能大赛中职组“网络安全”赛项竞赛样题-B模块安全事件响应/网络安全数据取证/应用安全
该内容描述了一组网络安全相关的挑战,涉及Windows渗透测试、数字取证、Web安全和跨站脚本渗透。挑战包括使用Kali Linux对服务器进行扫描,提取特定服务信息、DNS、管理员密码、文件名和内容等。此外,需要分析pcapng数据包文件,找出恶意HTTP访问、扫描端口、密码和木马信息。还有Web渗透测试,需访问不同URL并解决提示以获取Flag。最后,涉及跨站脚本攻击,需在不同目录下满足条件获取弹框信息。每个部分都要求参与者找出特定的安全标志物(Flag)。
13 0
|
11天前
|
安全 Linux 网络安全
2024年甘肃省职业院校技能大赛中职组 “网络安全”赛项竞赛样题-B模块基础设施设置/安全加固
该文档是关于企业服务器系统安全加固的任务说明,包括Windows和Linux环境。主要涉及密码和登录策略强化(如复杂度、锁定机制)、用户安全管理、本地安全策略设置(如关闭清理内存、禁止未登录关闭、限制软盘访问等)、流量保护、事件监控、服务加固(SSH、VSFTPD、IIS)以及防火墙策略(DNS转发、ping限制、端口禁用、MAC过滤、IP碎片防御、SSH访问控制)。要求对各种配置进行截图并以指定格式保存提交。
11 0
|
10月前
|
网络安全 数据安全/隐私保护
【Sword系列】第七届全国残疾人职业技能大赛样题-网络安全-疑惑的汉字
ROT13(回转13位,rotate by 13 places,有时中间加了个连字符称作ROT-13)是一种简易的替换式密码。ROT13被描述成“杂志字谜上下颠倒解答的Usenet点对点体”。ROT13 也是过去在古罗马开发的凯撒加密的一种变体。
112 0
|
11月前
|
编解码 网络安全
【Sword系列】第七届全国残疾人职业技能大赛样题-网络安全-md5?
十六进制转字符串的原理是将每两个十六进制数转化为一个ASCII字符。例如,"48 65 6C 6C 6F" 转换为 "Hello"。
102 0
 【Sword系列】第七届全国残疾人职业技能大赛样题-网络安全-md5?

推荐镜像

更多