QWB 2021 StandOnTheGaints Writeup

分析题目

程序首先使用 openssl 中的 bignum 库对输入进行 RSA 加密

bborOT+ohG*,U:;@/gVIAZ-,t++LaZkOrk?UcSOKJ?p-J+vuSN?:e,Kc/?h-oH?:tthoqYYSPp-ZC+Yw:*jrxPymGYO/PvDOIivNYtvJ?Mi*GG+/lmqEysrTdSD+eP+moP+l?+Np/oK=

然后再用 base64 变种对加密结果进行编码,最后和上面的密文进行比较

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*+,-./:;?@+-=

注意上面 base64 变种的常量表里面的 + 和 - 分别出现了两次,需要枚举所有可能的原串

RSA 模数分解

RSA 模数分解参考 https://www.cnblogs.com/algonote/p/14162469.html

\(n=2140324650240744961264423072839333563008614715144755017797754920881418023447140136643345519095804679610992851872470914587687396261921557363047454770520805119056493106687691590019759405693457452230589325976697471681738069364894699871578494975937497937\)

factordb 上查一下发现可以分解,从而可以求出私钥

\(d=1219002363472329316632678572665837077877528004905520939230037996503041169769564562618818603930146413036298872224725717654149810234132887053185714832075764978825457518728410705223332728199047961645304133836997233492855592278022423674340390891560261753\)

解密脚本

import base64
import binascii

#a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*+,-./:;?@+-="
a="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*+,-./:;?@$#="
b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
s="bborOT+ohG*,U:;@/gVIAZ-,t++LaZkOrk?UcSOKJ?p-J+vuSN?:e,Kc/?h-oH?:tthoqYYSPp-ZC+Yw:*jrxPymGYO/PvDOIivNYtvJ?Mi*GG+/lmqEysrTdSD+eP+moP+l?+Np/oK="

n=2140324650240744961264423072839333563008614715144755017797754920881418023447140136643345519095804679610992851872470914587687396261921557363047454770520805119056493106687691590019759405693457452230589325976697471681738069364894699871578494975937497937
d=1219002363472329316632678572665837077877528004905520939230037996503041169769564562618818603930146413036298872224725717654149810234132887053185714832075764978825457518728410705223332728199047961645304133836997233492855592278022423674340390891560261753

def test(c):
    c=c.translate(str.maketrans(a,b))
    c=base64.b64decode(c)
    c=int.from_bytes(c,byteorder='big',signed=False)
    m=pow(c,d,n)
    mx=hex(m)
    if (len(mx)<200):
        print(mx)
        m=m.to_bytes(length=0x68,byteorder='big',signed=False)
        print(m)
        input()

l=[]
for index,i in enumerate(s):
    if i in '+-':
        l.append(index)

p=list(s)
tr={"+":"$","-":"#"}

def enum(dep,ch):
    if (ch):
        p[l[dep]]=tr[s[l[dep]]]
    else:
        p[l[dep]]=s[l[dep]]
    if (dep==0):
        print(''.join(p))
        test(''.join(p))
    else:
        enum(dep-1,0)
        enum(dep-1,1)

enum(len(l)-1,0)
enum(len(l)-1,1)
posted @ 2021-06-14 01:04  Byaidu  阅读(194)  评论(0编辑  收藏  举报