中国鉱業大学2020年末大会学校大会wp

その他には、サインインして妻の
Lsbステガノグラフィを表示する他の意味はありません
ここに画像の説明を挿入

lspのタイトルからlsbステガノグラフィまで、ここに画像の説明を挿入

開いて、下位3ビットは0、
ここに画像の説明を挿入

次に、それらの間のスペースを削除します。それだけです。

ビッグバードターンラウンドターンラウンドターンラウンドターンラウンド
は同じソフトウェアを使用し、
ここに画像の説明を挿入

フレームごとの分析
ここに画像の説明を挿入
ここに画像の説明を挿入

まとめて出てきます

単純なrsa

from Crypto.Util.number import *
import gmpy2
k = 33168381182273613039378043939021834598473369704339979031406271655410089954946280020962013567831560156371101600701016104005421325248601464958972907319520487
c = 15648371218931722790904370162434678887479860668661143723578014419431384242698608484519131092011871609478799077215927112238954528656254346684710581567304227780228595294264728729958171950314042749100472064919234676544341981418897908716041285489451559413615567610248062182987859379618660273180094632711606707044369369521705956617241028487496003699514741969755999188620908457673804851050978409605236834130689819372028797174206307452231481436775711682625666741103384019125790777595493607264935529404041668987520925766499991295444934206081920983461246565313127213548970084044528257990347653612337100743309603015391586841499
e = 4097
phi = k-1
d=gmpy2.invert(e,phi)
flag = pow(c,d,k)
print(long_to_bytes(flag))

Rsaアルゴリズムeの公開鍵がわかっていて、c(暗号文)がわかっていて、タプルが与えられています。最初の要素は公開鍵、2番目の要素は秘密鍵です。Kはnなので、dは計算されます。pow( c、D、k)プレーンテキストを検索します。ここに画像の説明を挿入

参照ウェブサイトhttps://blog.cryptohack.org/cryptoctf2020

MgSO上的思路:
チャレンジは、モジュラス
N =(p ∗ q ∗ r)∗(p + q + r)
フラグを暗号化し、出力n = pqr、k = p + q + rを返します。暗号システムを完全に破るには、モジュラスのトーティエントを見つけたいと思います

ϕ(N)=(p-1)(q-1)(r-1)(p + q + r-1)です
が、暗号化されたメッセージmが十分に小さい場合は、これを単純化できます。m <kの場合、代わりにϕ(k)= k-1を見つけ、e-1modϕ(k)を見つけて、解くことができます。
l | nである限り、任意のn、lについて、任意の等価物a≡b(modn)もmod l:a≡b(modl)を保持することに注意してください(ただし、逆の場合は必ずしも保持されないことに注意してください)。これを完全に確認するには、
a⇔a⇒a≡b(modn)= b + kn = b + ktl(l | nなので、n = tl)≡b(modl)と書くことができます。
したがって、k | nなので、まるでシングルプライムRSA問題であるかのように、m≡m1+ ϕ(k)(modk)を解くことができます。また、m <kであるため、剰余[m] k(mをkで割ったときの残り)はmに正確に等しくなります。
ここに画像の説明を挿入

走り書きのパスワード
分析ロジックでは、置換パスワード、ある文字が別の文字に対応し、1回しか表示されないことがわかります。
スクリプトを使用して単語の頻度で分析したかったのですが、長い間行った後、ひびの入ったオンラインのウェブサイトを検索してみたところ、本当に回り道が必要でした。
ここに画像の説明を挿入

ウェブサイトhttps://quipqiup.com/への接続をクラックします
ここに画像の説明を挿入

ez_rsa
の質問をした、すぐにGoogleで検索して、元の質問を見つけました。

from Crypto.Util.number import *
from  gmpy2 import invert
n=17986052241518124152579698727005505088573670763293762110375836247355612011054569717338676781772224186355540833136105641118789391002684013237464006860953174190278718294774874590936823847040556879723368745745863499521381501281961534965719063185861101706333863256855553691578381034302217163536137697146370869852180388385732050177505306982196493799420954022912860262710497234529008765582379823928557307038782793649826879316617865012433973899266322533955187594070215597700782682186705964842947435512183808651329554499897644733096933800570431036589775974437965028894251544530715336418443795864241340792616415926241778326529055663
e=65537
enc=17505679398266502116464734134128725340247050682772207798718112582701162398326982870035320307354098156145675458669731605067821790146061040637109327455205893324813052120216078570610930872674755246099365674625431655007219684642963335426955196473587347290657014023186920750946928312239116919090008342804123453311441848155223191179999664929660663345568499980778425899869956228245802722031728956228667784902213280684273577858909961747898300981963006329584725303446719192681170020458749808054637224882633325702468591074293728614333360418157985394943356536309321590140334348949095024011542798810065149061943391776967748248277703228
beta=11864389277042761216996641604675717452843530574016671576684180662096506094587545173005905433938758559675517932481818900399893444422743930613073261450555599
tip = (n-1)//(2*beta)  
xy1=tip//beta
def attack(xy1):
    while True:
        try:
            xy1=xy1-2
            d=invert(e,2*xy1*pow(beta,2))
            c=pow(3,e,n)
            if pow(c,d,n)==3:
                return d
            else:
                continue
        except:
            continue
d=attack(xy1)
print long_to_bytes(pow(enc,d,n))

次に、x + yを取得する問題については、ベータが512ビットでnビットの数が2068であるため、pビットの平均数は1034であり、xビットの数はおそらく1034 – 1 – 512 = 521です。 x + yとベータの差は約10桁で、完全に暴力的です。n= p * q = 4xybeta ^ 2 + 2(x + y)beta + 1
ヒントを取得するのは自然です=(n-1)/ / beta
次に、先端係数ベータを与えます。(x + y)%betaを取得できます。x+ yを取得できれば、明らかにx * yを取得できます。次に、方程式を解いてxとyを取得します。 pとqを取得し、rsaを復号化してフラグを取得します。基本的には、py2で実行し、対応するパラメーターを変更するだけです。ブラストが失敗したため、
Try
Exceptステートメントを使用する必要がありますが、続行する必要があります
(元を元に戻すことはできません)
最初のエラーは、おそらくエラーステートメントが書き込みに使用されなかったことが原因です

py2環境がどこに行くのか忘れてしまったので、私が書いたスクリプトとチームメート
実行したexpが出てきて、チェックインしました。
参照Webサイトhttps://www.cnblogs.com/crybaby/p/12940219.html
参照スクリプト
書き込みexp

from Crypto.Cipher import AES

def xor(p1, p2):
    tmp = ''
    for i in range(len(p2)):
        tmp += chr(ord(p1[i]) ^ ord(p2[i]))
    return tmp
key = "\t\xe6\x85]):\x1b\x86\xffD\xf1\x89H\xb1\x9b\xac"
cipherText1 = "ed64978b91ef5b62561a44c8f529b91f".decode("hex")
cipherText = "fd6dd5e0f9ab258b2bc9c813177e3ad677116d2f08c69517d0e7796c1f5e06ba95c3de5a139bb687bf3e779a0730e47c".decode("hex")
plainText = "CBC_Cr4cked_succ"
fakeIV = "aaaaaaaaaaaaaaaa"
fakeIVAes = AES.new(key, AES.MODE_CBC, fakeIV)
fakePlainText = fakeIVAes.decrypt(cipherText1)
enc_msg = xor(fakePlainText, fakeIV)
iv = xor(enc_msg, plainText)
print len(iv)
print "iv is : " + iv
aes = AES.new(key, AES.MODE_CBC, iv)
flag = aes.decrypt(cipherText)
print flag

この暗号化アルゴリズム、モデルは暗号化クラスで学習したモデルです。暗号化を学習した人でも使用できると思います。私はpy2環境を持っていないので、チームメートが実行しています。

最初のレベルを作成し、次に2番目のレベルを作成しました

flag = "bxsyyds{
    
    xxxxxxx}
assert flag.startswith("bxsyyds{")
assert flag.endswith("}")
assert len(flag)==16

def lfsr(R,mask):
    output = (R << 1) & 0xfffffff
    i=(R&mask)&0xfffffff
    lastbit=0
    while i!=0:
        lastbit^=(i&1)
        i=i>>1
    output^=lastbit 
    return (output,lastbit)

R=int(flag[8:-1],16)
mask=0b1001000000100000001000100101
f=open("result","w")
for i in range(100):
    tmp=0
    for j in range(8):
        (R,out)=lfsr(R,mask)
        tmp=(tmp << 1)^out
    f.write(chr(tmp))
f.close()

暗号化実験を行った後、それがlsfrストリーム暗号であることが簡単にわかります。結果に対応するバイナリモードの最初の7 * 4 = 28バイナリストリームを見つける必要があります。

最初の不注意のために、16進数から2進数への変換が間違っていました!
かなり回り道

それから、人生について少し考えた後、バイナリシステムが正しいかどうかを確認してください、それは間違っていることがわかりました。

re1

参照
https://driverxdw.github.io/2019/04/24/2019%E8%A5%BF%E6%B9%96%E8%AE%BA%E5%89%91CTF-%E4%BA%8C/

0x3A = 3 * 16 + 10 =
58BASE58エンコーディング

上記を実行するときにEnterキーを押すのを忘れました...

>>> s='34avux4BwXYJzh1nHK1oG5xTKeBSCERZs4xC'
>>> t='123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
>>> flag=0
>>> for i in range(len(s)):
...     flag=flag*58+t.index(s[i])
... flag
  File "<stdin>", line 3
    flag
    ^
SyntaxError: invalid syntax
>>> flag
0
>>> flag
0
>>> for i in range(len(s)):
...     flag=flag*58+t.index(s[i])
...     
>>> flag
108200298718158997245509125691632101258313020496600351308152445
>>> hex(flag)
'0x43554d544354467b3841736535425f31735f456135797e7e7e7d'
>>> from binascii import *
>>> a2b_hex('43554d544354467b3841736535425f31735f456135797e7e7e7d')
b'CUMTCTF{8Ase5B_1s_Ea5y~~~}'

おすすめ

転載: blog.csdn.net/xulei1132562/article/details/113527931