2022第三届网鼎杯网络安全大赛 青龙组 WriteUp

admin 2022年8月27日23:44:43CTF专场评论950 views8461字阅读28分12秒阅读模式

解题过程

RE

re693

直接下载附件用golang打开

看main函数可以发现会打印两句话,要求输入有六个参数并且第三个为gLIhR 的函数、被调用三次并且会调用到cHZv5op8rOmlAkb6的函数

Input the first function, which has 6 parameters and the third named gLIhR:输入第一个函数,它有 6 个参数,第三个名为 gLIhRInput the second function, which has 3 callers and invokes the function named cHZv5op8rOmlAkb6:输入第二个函数,它有 3 个调用者并调用名为 cHZv5op8rOmlAkb6 的函数:

直接全局搜索,第一个函数为ZlXDJkH3OZN4Mayd,有6个参数

2022第三届“网鼎杯”网络安全大赛 青龙组 WriteUp

第二个函数可以先全局搜索cHZv5op8rOmlAkb6 看哪个函数会调用到这个函数,然后再进一步搜索看看符不符合题意,相对应函数为UhnCm82SDGE0zLYO

手lu

2022第三届“网鼎杯”网络安全大赛 青龙组 WriteUp

有6个,出去自己,还有之后那个2个重复判断,则有3个调用

2022第三届“网鼎杯”网络安全大赛 青龙组 WriteUp

然后就是看主函数

func main() { var nFAzj, CuSkl string    jjxXf := []byte{ 37, 73, 151, 135, 65, 58, 241, 90, 33, 86, 71, 41, 102, 241, 213, 234, 67, 144, 139, 20, 112, 150, 41, 7, 158, 251, 167, 249, 24, 129, 72, 64, 83, 142, 166, 236, 67, 18, 211, 100, 91, 38, 83, 147, 40, 78, 239, 113, 232, 83, 227, 47, 192, 227, 70, 167, 201, 249, 156, 101, 216, 159, 116, 210, 152, 234, 38, 145, 198, 58, 24, 183, 72, 143, 136, 234, 246} KdlaH := []byte{ 191, 140, 114, 245, 142, 55, 190, 30, 161, 18, 200, 7, 21, 59, 17, 44, 34, 181, 109, 116, 146, 145, 189, 68, 142, 113, 0, 33, 46, 184, 21, 33, 66, 99, 124, 167, 201, 88, 133, 20, 211, 67, 133, 250, 62, 28, 138, 229, 105, 102, 125, 124, 208, 180, 50, 146, 67, 39, 55, 240, 239, 203, 230, 142, 20, 90, 205, 27, 128, 136, 151, 140, 222, 92, 152, 1, 222, 138, 254, 246, 223, 224, 236, 33, 60, 170, 189, 77, 124, 72, 135, 46, 235, 17, 32, 28, 245}    fmt.Print(MPyt9GWTRfAFNvb1(jjxXf))    fmt.Scanf("%20s", &nFAzj)    fmt.Print(kZ2BFvOxepd5ALDR(KdlaH))    fmt.Scanf("%20s", &CuSkl)    vNvUO := GwSqNHQ7dPXpIG64(nFAzj) YJCya := ""    mvOxK := YI3z8ZxOKhfLmTPC(CuSkl) if mvOxK != nil { YJCya = mvOxK() }


if YJCya != "" && vNvUO != "" {        fmt.Printf("flag{%s%s}n", vNvUO, YJCya) }}

flag分为两段,第一段为vNvUO,第二段为YJCya

第一段函数

func GwSqNHQ7dPXpIG64(cJPTR string) string { YrXQd := hex.EncodeToString([]byte(cJPTR)) return fmt.Sprintf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", YrXQd[22], YrXQd[19], YrXQd[20], YrXQd[21], YrXQd[28], YrXQd[10], YrXQd[20], YrXQd[7], YrXQd[29], YrXQd[14], YrXQd[0], YrXQd[18], YrXQd[3], YrXQd[24], YrXQd[27], YrXQd[31])}

第一段exp

YrXQd=bytes.hex('ZlXDJkH3OZN4Mayd'.encode())print(YrXQd[22], YrXQd[19], YrXQd[20], YrXQd[21], YrXQd[28], YrXQd[10], YrXQd[20], YrXQd[7], YrXQd[29], YrXQd[14], YrXQd[0], YrXQd[18], YrXQd[3], YrXQd[24], YrXQd[27], YrXQd[31],sep='')

第二段涉及函数

2022第三届“网鼎杯”网络安全大赛 青龙组 WriteUp

这一块是返回函数,要去调用UhnCm82SDGE0zLYO

func UhnCm82SDGE0zLYO() string { SythK := []byte{ 159, 141, 72, 106, 196, 62, 16, 205, 170, 159, 36, 232, 125, 239, 208, 3} var Vw2mJ, Nij87, zVclR string return cHZv5op8rOmlAkb6(SythK, Vw2mJ, Nij87, zVclR)}func cHZv5op8rOmlAkb6(HIGXt []byte, VGvny string, ZOkKV string, eU0uD string) string { QTk4l := make([]byte, 20) Ek08m := [16]byte{ 167, 238, 45, 89, 160, 95, 34, 175, 158, 169, 20, 217, 68, 137, 231, 54} for i := 0; i < 16; i++ { QTk4l[i] += Ek08m[i] ^ HIGXt[i] }


return string(QTk4l)}

其中后面几个Vw2mJ, Nij87, zVcl,参数为无效参数

exp

QTk4l=[0]*16SythK= [159, 141, 72, 106, 196, 62, 16, 205, 170, 159, 36, 232, 125, 239, 208, 3]Ek08m=[167, 238, 45, 89, 160, 95, 34, 175, 158, 169, 20, 217, 68, 137, 231, 54]for i in range(16): QTk4l[i] = chr(Ek08m[i] ^ SythK[i])for i in QTk4l: print(i,end='')
2022第三届“网鼎杯”网络安全大赛 青龙组 WriteUp

#非预期,自己的go环境运行输入第一个会直接退出,队友的运行直接可以得到flag,离谱

2022第三届“网鼎杯”网络安全大赛 青龙组 WriteUp

flag:

flag{3a4e76449355c4148ce3da2b46019f75}

re694

2022第三届“网鼎杯”网络安全大赛 青龙组 WriteUp

被魔改了,将FUK修改成UPX,正常脱壳

2022第三届“网鼎杯”网络安全大赛 青龙组 WriteUp

然后进行分析

IDA打开,找关键字符串,再定位到关键函数

2022第三届“网鼎杯”网络安全大赛 青龙组 WriteUp

两个关键的判断函数,第一个进去发现判断是否为20长,然后再输入的值异或上0x66

2022第三届“网鼎杯”网络安全大赛 青龙组 WriteUp

第二个判断函数,是将第一个判断后的值加上10再异或0x50,再和dword_14001D000里的数比较

2022第三届“网鼎杯”网络安全大赛 青龙组 WriteUp

即是$flag = ((enc oplus 0x50)-10)oplus0x66$

x = ['4B', '48', '79', '13', '45', '30', '5C', '49', '5A', '79', '13', '70', '6D', '78', '13', '6F', '48', '5D', '64', '64']for i in x: print(chr(((int(i, 16) ^ 0x50) - 10) ^ 0x66), end='')

flag:

flag{why_m0dify_pUx_SheLL}

MISC

签到

知识竞赛,答对8题即可

2022第三届“网鼎杯”网络安全大赛 青龙组 WriteUp

flag:

flag{a236b34b-8040-4ea5-9e1c-97169aa3f43a}

CRYPTO

crypto091

根据描述和其中提到的论文,Hash值为电话号码的sha256

170号段首批放号的联通号码以1709开头,直接爆破即可

x = 'c22a563acc2a587afbfaaaa6d67bc6e628872b00bd7e998873881f7c6fdc62fc'import hashlibn = b'861709's = list('0123456789'.strip())import itertoolsfor i in itertools.product(s,repeat = 7):    d = ''.join(i).encode()    g = n+d if hashlib.sha256(g).hexdigest() == x: print(g) break# b'8617091733716'

crypto162

2022第三届“网鼎杯”网络安全大赛 青龙组 WriteUp

from hashlib import md5, sha256from Crypto.Cipher import AES


cof_t = [[353, -1162, 32767], [206, -8021, 42110], [262, -7088, 31882], [388, -6394, 21225], [295, -9469, 44468], [749, -3501, 40559], [528, -2690, 10210], [354, -5383, 18437], [491, -8467, 26892], [932, -6984, 20447], [731, -6281, 11340], [420, -5392, 44071], [685, -6555, 40938], [408, -8070, 47959], [182, -9857, 49477], [593, -3584, 49243], [929, -7410, 31929], [970, -4549, 17160], [141, -2435, 36408], [344, -3814, 18949], [291, -7457, 40587], [765, -7011, 32097], [700, -8534, 18013], [267, -2541, 33488], [249, -8934, 12321], [589, -9617, 41998], [840, -1166, 22814], [947, -5660, 41003], [206, -7195, 46261], [784, -9270, 28410], [338, -3690, 19608], [559, -2078, 44397], [534, -3438, 47830], [515, -2139, 39546], [603, -6460, 49953], [234, -6824, 12579], [805, -8793, 36465], [245, -5886, 21077], [190, -7658, 20396], [392, -7053, 19739], [609, -5399, 39959], [479, -8172, 45734], [321, -7102, 41224], [720, -4487, 11055], [208, -1897, 15237], [890, -4427, 35168], [513, -5106, 45849], [666, -1137, 23725], [755, -6732, 39995], [589, -6421, 43716], [866, -3265, 30017], [416, -6540, 34979], [840, -1305, 18242], [731, -6844, 13781], [561, -2728, 10298], [863, -5953, 23132], [204, -4208, 27492], [158, -8701, 12720], [802, -4740, 16628], [491, -6874, 29057], [531, -4829, 29205], [363, -4775, 41711], [319, -9206, 46164], [317, -9270, 18290], [680, -5136, 12009], [880, -2940, 34900], [162, -2587, 49881], [997, -5265, 20890], [485, -9395, 23048], [867, -1652, 18926], [691, -7844, 11180], [355, -5990, 13172], [923, -2018, 23110], [214, -4719, 23005], [921, -9528, 29351], [349, -7957, 20161], [470, -1889, 46170], [244, -6106, 23879], [419, -5440, 43576], [930, -1123, 29859], [151, -5759, 23405], [843, -6770, 36558], [574, -6171, 33778], [772, -1073, 44718], [932, -4037, 40088], [848, -5813, 27304], [194, -6016, 39770], [966, -6789, 14217], [219, -6849, 40922], [352, -6046, 18558], [794, -8254, 29748], [618, -5887, 15535], [202, -9288, 26590], [611, -4341, 46682], [155, -7909, 16654], [935, -5739, 39342], [998, -6538, 24363], [125, -5679, 36725], [507, -7074, 15475], [699, -5836, 47549]]



def cal(i, cof): if i < 3: return i + 1 else: return cof[2] * cal(i - 3, cof) + cof[1] * cal(i - 2, cof) + cof[0] * cal(i - 1, cof)



def cal_m(i, cof):    M = Matrix(ZZ, [[cof[0], cof[1], cof[2]], [1, 0, 0], [0, 1, 0]])    b = vector(ZZ, [cal(5, cof), cal(4, cof), cal(3, cof)])    b = M ^ (i - 5) * b return int(b[0])



s = 0for i in range(100):    s += cal_m(200000, cof_t[i])


s = str(s)[-2000:-1000]key = bytes.fromhex(md5(s.encode()).hexdigest())check = sha256(key).hexdigest()verify = '2cf44ec396e3bb9ed0f2f3bdbe4fab6325ae9d9ec3107881308156069452a6d5'assert (check == verify)aes = AES.new(key, AES.MODE_ECB)# 4f12b3a3eadc4146386f4732266f02bd03114a404ba4cb2dabae213ecec451c9d52c70dc3d25154b5af8a304afafed87c = '4f12b3a3eadc4146386f4732266f02bd03114a404ba4cb2dabae213ecec451c9d52c70dc3d25154b5af8a304afafed87'c = bytes.fromhex(c)print(aes.decrypt(c))# b'flag{519427b3-d104-4c34-a29d-5a7c128031ff}x00x00x00x00x00x00'

crypto405

给了42个2022第三届网鼎杯网络安全大赛 青龙组 WriteUp,不过每组k都是有一定的规律

42长可以猜测flag 的形式为flag{uuid4}

那么前面5个grasshopper就是已知的,列出开头五组的式子

flag = b'flag{'var('k0 k1 k2 k3 k4')k = [k0, k1, k2, k3, k4]res = []for i in range(len(flag)):    grasshopper = flag[i] for j in range(5):        k[j] = grasshopper = grasshopper * k[j]    res.append(grasshopper)print(res)

2022第三届“网鼎杯”网络安全大赛 青龙组 WriteUp

这里就有五组等式,本来想着通过z3直接求,不过很遗憾不行

后来又观察到,如果将乘法看成加法,次幂看成乘法,那么该五组式子就可以看成线性方程组,这样子更方便我们求解 

2022第三届“网鼎杯”网络安全大赛 青龙组 WriteUp

将该矩阵通过行列变换得到单位矩阵,那么就能求出$k$(行列变化的加法和乘法分别为乘法和次幂,减法为乘上逆元)

其中我们并不知道p,但p为2022第三届“网鼎杯”网络安全大赛 青龙组 WriteUp的素数,可以直接爆破,通过求出$k$后再爆破uuid4求出grasshopper与原来flag求出来的值相比较即可

from Crypto.Util.number import *from gmpy2 import *



def tran1(n, base, arr, x, y):    r = [] for i in range(5):        r.append(base[i] * n)    res = pow(x, n, p)


for i in range(5):        r[i] = r[i] - arr[i]    res = res * inverse(y, p) % p return r, res



def tran2(n, base, arr, x, y):    r = [] for i in range(5):        r.append(base[i] * n)    res = pow(x, n, p)


for i in range(5):        r[i] = arr[i] - r[i]    res = y * inverse(res, p) % p return r, res



f = open('output.txt', 'r')res = []for i in range(42):    res.append(int(f.readline()[-5:-1], 16))y = res[:5]yy = [102, 1192407267456, 1918196473060530916599580974905403195260928, 56112321905504104058889432264614118677688107359359075763851172322711550767834986156510191423865157053692191440896, 53396244662367707127856864007524389027579357260572582679744127850279999404450619312604004485139827409110793046460181646479623909080635340073160838110289140978788817626824929446784411034165296270303004366240008622426141394072733814130556872463873302593536]p = next_prime(max(res))while p < 2 ** 16:    y = res[:5].copy() for i in range(5):        y[i] = y[i] * inverse(yy[i], p)    x = [[1, 1, 1, 1, 1], [5, 4, 3, 2, 1], [15, 10, 6, 3, 1], [35, 20, 10, 4, 1], [70, 35, 15, 5, 1]] for j in range(0, 4): for i in range(j + 1, 5):            x[i], y[i] = tran1(x[i][j], x[j], x[i], y[j], y[i]) for j in range(4, 0, -1): for i in range(j):            x[i], y[i] = tran2(x[i][j], x[j], x[i], y[j], y[i])    flag = b'flag{' for i in range(len(flag)):        grasshopper = flag[i] for j in range(5):            y[j] = grasshopper = grasshopper * y[j] % p for k in range(36): for i in '0123456789abcdef-':            kkk = y.copy()            grasshopper = ord(i) for j in range(5):                kkk[j] = grasshopper = grasshopper * kkk[j] % p if grasshopper == res[5 + k]:                y = kkk.copy() if p == 59441: print(i, end='') # print(i,p) break    p = next_prime(p)# flag{749d39d4-78db-4c55-b4ff-bca873d0f18e}


往期推荐

第二届“长城杯”网络安全大赛 高校组 WriteUp

2022巅峰极客网络安全技能挑战赛 WriteUp

团建分享 | 与你,“安”于心

2022第三届网鼎杯网络安全大赛 青龙组 WriteUp
2022第三届网鼎杯网络安全大赛 青龙组 WriteUp
















































扫码关注我们

文案 | SimpleGipsy

原文始发于微信公众号(杭师大网安):2022第三届“网鼎杯”网络安全大赛 青龙组 WriteUp

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年8月27日23:44:43
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  2022第三届网鼎杯网络安全大赛 青龙组 WriteUp https://cn-sec.com/archives/1257673.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: