0%

HGAME—2024—week3

HGAME 2024网络攻防大赛—week3部分题目题解

reverse

encrypt

IDA打开,一堆Windows api

首先先解释一下各个api的作用:

BCryptOpenAlgorithmProvider: 打开一个密码算法提供者。

BCryptGetProperty: 获取密码算法提供者的属性。在这里,它获取了ObjectLengthBlockLength两个属性。ObjectLength属性用于分配内存,BlockLength属性用于设置密码算法的块长度。

BCryptSetProperty: 设置密码算法提供者的属性。在这里,它设置了对称加密的链接模式(Chaining Mode)

BCryptGenerateSymmetricKey: 生成对称密钥。

BCryptExportKey: 导出密钥。

BCryptEncrypt: 加密数据。

BCryptDestroyKey: 销毁密钥对象。

BCryptCloseAlgorithmProvider: 关闭算法提供者。

GetProcessHeap: 获取当前进程的堆句柄。

HeapAlloc: 在堆中分配内存。

HeapFree: 释放堆中的内存。

通过对这些api的解释,我们可以知道这个程序就是通过使用Windows api来生成一个加密体系来对flag进行加密

看到最后:

那么这个unk_7FF796305050应该就是密文了

现在还需要知道加密模式,动调起来应该可以知道

动调后进入到算法提供的pszAlgId

可以知道该加密算法是aes,模式是cbc

那么现在还需要找到key和iv

BCryptGenerateSymmetricKey是生成key

那么key就在pbSecret

iv则猜测在memcpy对&unk_7FF78E6634A0的比较中

最后使用cyberchef解aes

mystery

IDA打开,通过strings定位到关键函数

首先第一个函数就是生成一个keybox

第二步则是使用生成的keybox对我们的输入进行加密

两个函数合起来就是一个清晰的rc4,加密和解密都是同样的脚本,只不过最后被改为*a2++ -= result;

但是result可以通过动调获取,于是可以编写一个idapython的脚本,输出result

首先在result转到指令下断点

然后选edit breakpoint

写下如下脚本

import idaapi
print(idaapi.get_reg_val('al'),end=',')
return False

最后动调,随便给一个输入,就自动输出result了

然后就是解密,s2是密文,key也给出

exp:

v = [24, 37, 41, 32, 25, 39, 185, 201, 52, 199, 113, 201, 172, 23, 180, 30, 229, 233, 252, 42, 74, 1, 234, 121, 199,
130, 254, 81, 231, 177, 174, 40, 21, 172, 45, 155, 21, 111, 57, 15, 200, 235, 72, 160, 41, 248, 25, 63, 1, 231,
139, 31, 143, 15, 189, 246]
s = [0x50, 0x42, 0x38, 0x4D, 0x4C, 0x54, 0x90, 0x6F, 0xFE, 0x6F,
0xBC, 0x69, 0xB9, 0x22, 0x7C, 0x16, 0x8F, 0x44, 0x38, 0x4A,
0xEF, 0x37, 0x43, 0xC0, 0xA2, 0xB6, 0x34, 0x2C]
for i in range(len(s)):
print(chr((s[i] + v[i])%256),end='')

findme

IDA打开,进入到main函数

下面的base64解码也是一个假的flag

往下看 看到buffer

mz......像是一个exe文件头,根据题目描述,一堆奇怪的数据

那么有可能这段数据就是题目的真正的exe,现在把这段数据dump出来

编写脚本

static main()
{
auto i,fp;
fp = fopen("d:\\dump.exe","wb");
auto start = 0x140004040;
auto end = 0x14000D8DF;
for(i=start;i<end;i=i+4)
{
fputc(Byte(i),fp);
}
fp.close();
}

dump出来后打开得到的exe

果然这才是真正的exe

发现有许多jz jnz构成的花指令,手动patch掉后对main函数重新定义,则可以f5查看伪代码

查看sub_641068函数和sub_64110C函数

又是一个rc4,类似上面mystery

那么用idapython脚本导出result

import idaapi
print(idaapi.get_reg_val('al'),end=',')
return False

最后用密文—result得到flag

exp:

v = [0x7D, 0x2B, 0x43, 0xA9, 0xB9, 0x6B, 0x93, 0x2D, 0x9A, 0xD0,
0x48, 0xC8, 0xEB, 0x51, 0x59, 0xE9, 0x74, 0x68, 0x8A, 0x45,
0x6B, 0xBA, 0xA7, 0x16, 0xF1, 0x10, 0x74, 0xD5, 0x41, 0x3C,
0x67, 0x7D]
s = [21,196,226,60,84,240,77,193,106,89,21,86,120,242,24,119,65,9,52,224,249,65,72,176,127,220,13,99,224,206,243,0]
for i in range(len(v)):
c = v[i]-s[i]
if c<0:
print(chr(c+256),end='')
else:
print(chr(c),end='')

crypto

exRSA

attachment.py

from Crypto.Util.number import *
from secret import flag
m=bytes_to_long(flag)
p=getStrongPrime(1024)
q=getStrongPrime(1024)
phi=(p-1)*(q-1)
e1=inverse(getPrime(768),phi)
e2=inverse(getPrime(768),phi)
e3=inverse(getPrime(768),phi)
n=p*q
c=pow(m,0x10001,n)
print(f'e1={e1}')
print(f'e2={e2}')
print(f'e3={e3}')
print(f'c={c}')
print(f'n={n}')

"""
e1=5077048237811969427473111225370876122528967447056551899123613461792688002896788394304192917610564149766252232281576990293485239684145310876930997918960070816968829150376875953405420809586267153171717496198336861089523701832098322284501931142889817575816761705044951705530849327928849848158643030693363143757063220584714925893965587967042137557807261154117916358519477964645293471975063362050690306353627492980861008439765365837622657977958069853288056307253167509883258122949882277021665317807253308906355670472172346171177267688064959397186926103987259551586627965406979118193485527520976748490728460167949055289539
e2=12526848298349005390520276923929132463459152574998625757208259297891115133654117648215782945332529081365273860316201130793306570777735076534772168999705895641207535303839455074003057687810381110978320988976011326106919940799160974228311824760046370273505511065619268557697182586259234379239410482784449815732335294395676302226416863709340032987612715151916084291821095462625821023133560415325824885347221391496937213246361736361270846741128557595603052713612528453709948403100711277679641218520429878897565655482086410576379971404789212297697553748292438183065500993375040031733825496692797699362421010271599510269401
e3=12985940757578530810519370332063658344046688856605967474941014436872720360444040464644790980976991393970947023398357422203873284294843401144065013911463670501559888601145108651961098348250824166697665528417668374408814572959722789020110396245076275553505878565603509466220710219260037783849276475397283421068716088638186994778153542817681963059581651103563578804145156157584336712678882995685632615686853980176047683326974283896343322981521150211317597571554542488921290158122634140571148036732893808064119048328855134054709120877895941670166421664806186710346824494054783025733475898081247824887967550418509038276279
c=1414176060152301842110497098024597189246259172019335414900127452098233943041825926028517437075316294943355323947458928010556912909139739282924255506647305696872907898950473108556417350199783145349691087255926287363286922011841143339530863300198239231490707393383076174791818994158815857391930802936280447588808440607415377391336604533440099793849237857247557582307391329320515996021820000355560514217505643587026994918588311127143566858036653315985177551963836429728515745646807123637193259859856630452155138986610272067480257330592146135108190083578873094133114440050860844192259441093236787002715737932342847147399
n=17853303733838066173110417890593704464146824886316456780873352559969742615755294466664439529352718434399552818635352768033531948009737170697566286848710832800426311328560924133698481653594007727877031506265706341560810588064209681809146597572126173303463125668183837840427667101827234752823747483792944536893070188010357644478512143332014786539698535220139784440314481371464053954769822738407808161946943216714729685820896972467020893493349051243983390018762076812868678098172416465691550285372846402991995794349015838868221686216396597327273110165922789814315858462049706255254066724012925815100434953821856854529753
phi=17853303733838066173110417890593704464146824886316456780873352559969742615755294466664439529352718434399552818635352768033531948009737170697566286848710832800426311328560924133698481653594007727877031506265706341560810588064209681809146597572126173303463125668183837840427667101827234752823747483792944536892802927070181771490686318736012878592343518366616230003156532617279650769801240788457082470798285098309787313234015003029546069389983917646339464213270307973083920197245464323265774603130048384907423910358440436321967414553635119220303427088297964135321132951478390454424777782514867778927855950169251946270628
"""

考点是rsa多组低解密指数攻击,直接上脚本

exp:

#sage
from Crypto.Util.number import long_to_bytes
import gmpy2


N = 17853303733838066173110417890593704464146824886316456780873352559969742615755294466664439529352718434399552818635352768033531948009737170697566286848710832800426311328560924133698481653594007727877031506265706341560810588064209681809146597572126173303463125668183837840427667101827234752823747483792944536893070188010357644478512143332014786539698535220139784440314481371464053954769822738407808161946943216714729685820896972467020893493349051243983390018762076812868678098172416465691550285372846402991995794349015838868221686216396597327273110165922789814315858462049706255254066724012925815100434953821856854529753
e1 = 5077048237811969427473111225370876122528967447056551899123613461792688002896788394304192917610564149766252232281576990293485239684145310876930997918960070816968829150376875953405420809586267153171717496198336861089523701832098322284501931142889817575816761705044951705530849327928849848158643030693363143757063220584714925893965587967042137557807261154117916358519477964645293471975063362050690306353627492980861008439765365837622657977958069853288056307253167509883258122949882277021665317807253308906355670472172346171177267688064959397186926103987259551586627965406979118193485527520976748490728460167949055289539
e2 = 12526848298349005390520276923929132463459152574998625757208259297891115133654117648215782945332529081365273860316201130793306570777735076534772168999705895641207535303839455074003057687810381110978320988976011326106919940799160974228311824760046370273505511065619268557697182586259234379239410482784449815732335294395676302226416863709340032987612715151916084291821095462625821023133560415325824885347221391496937213246361736361270846741128557595603052713612528453709948403100711277679641218520429878897565655482086410576379971404789212297697553748292438183065500993375040031733825496692797699362421010271599510269401
e3 = 12985940757578530810519370332063658344046688856605967474941014436872720360444040464644790980976991393970947023398357422203873284294843401144065013911463670501559888601145108651961098348250824166697665528417668374408814572959722789020110396245076275553505878565603509466220710219260037783849276475397283421068716088638186994778153542817681963059581651103563578804145156157584336712678882995685632615686853980176047683326974283896343322981521150211317597571554542488921290158122634140571148036732893808064119048328855134054709120877895941670166421664806186710346824494054783025733475898081247824887967550418509038276279
c = 1414176060152301842110497098024597189246259172019335414900127452098233943041825926028517437075316294943355323947458928010556912909139739282924255506647305696872907898950473108556417350199783145349691087255926287363286922011841143339530863300198239231490707393383076174791818994158815857391930802936280447588808440607415377391336604533440099793849237857247557582307391329320515996021820000355560514217505643587026994918588311127143566858036653315985177551963836429728515745646807123637193259859856630452155138986610272067480257330592146135108190083578873094133114440050860844192259441093236787002715737932342847147399



alpha2 = 815./2048
M1 = int(gmpy2.mpz(N)**(3./2))
M2 = int( gmpy2.mpz(N) )
M3 = int(gmpy2.mpz(N)**(3./2 + alpha2))
M4 = int( gmpy2.mpz(N)**(0.5) )
M5 = int( gmpy2.mpz(N)**(3./2 + alpha2) )
M6 = int( gmpy2.mpz(N)**(1.+alpha2) )
M7 = int( gmpy2.mpz(N)**(1.+alpha2) )
D = diagonal_matrix(ZZ, [M1, M2, M3, M4, M5, M6, M7, 1])
B = Matrix(ZZ, [ [1, -N, 0, N**2, 0, 0, 0, -N**3],
[0, e1, -e1, -e1*N, -e1, 0, e1*N, e1*N**2],
[0, 0, e2, -e2*N, 0, e2*N, 0, e2*N**2],
[0, 0, 0, e1*e2, 0, -e1*e2, -e1*e2, -e1*e2*N],
[0, 0, 0, 0, e3, -e3*N, -e3*N, e3*N**2],
[0, 0, 0, 0, 0, e1*e3, 0, -e1*e3*N],
[0, 0, 0, 0, 0, 0, e2*e3, -e2*e3*N],
[0, 0, 0, 0, 0, 0, 0, e1*e2*e3] ]) * D

L = B.LLL()

v = Matrix(ZZ, L[0])
x = v * B**(-1)
phi_ = (e1*x[0,1]/x[0,0]).floor()
d = inverse_mod( 65537, phi_)
m = hex(power_mod(c, d, N))[2:]
print(bytes.fromhex(m))

misc

与ai聊天

misc签到题

进网页让ai输出flag

----------------本文结束 感谢您的阅读----------------