NKCTF2024 复现+wp
NKCTF:
Crypto:
1.eZ_Math:
这道题经过分析做了出来:
题目:
1 | from Crypto.Util.number import * |
分析一下源码,加密逻辑是这样的
p , q , r , s 都是 512 位的素数
分析一下:
于是
我当时没想到模 pq 可以(我只想到了模 p ),但是算出来是 1024 位,回去又算了一下发现了。
然后:
根据二项式定理:
但
之后取 s-1 除以最大公因数计算模逆元得出
1 | flag:nkctf{cb5b7392-cca4-4ce2-87e7-930cf6b29959} |
2.GGH
1 | from sage.all import * |
一道典型的格上问题,我的格子构造对了,但不知道要简化,所以一直 runtime error
错误示范:
1 | from sage.all import * |
因为 r 足够小,所以经过 BKZ 求出来的最短向量很可能就是 r (但不知道可以通过前11位明文简化)
实际:
因此再用:
求出 r ,带回原式计算得:
以下是我看了 wp 后自己改的脚本:
1 | from sage.all import * |
另一方法:爆破 delta
1 | import re |
flag:
1 | flag:nkctf{G0od_Y0u_Ar3_Kn0W_Ggh_Crypt0syst3m!!!} |
3.EZ_random
1 | from random import randint |
用了一个十分巧妙的降维:
我们来解决一个子问题:
恢复 key 的一个 bit
定义一个 GF(2) 上的 m 维向量
若已知
关系1.
此时
关系2:
因此,构造出
根据 key 的生成代码:
1 | class MyBytesGen: |
可知经一次 next_byte ,1 的奇偶个数会发生交替变化, 因此在 GF(2) 上,每个字节的 l 分别为 1 或 0
因此 l 便已知:
exp:
1 | from sage.all import * |
flag:
1 | flag:NKCTF{1ab1e94f-a699-431b-8f17-8aabdea55ec6} |
4.drsn
main.py
这道题代码审计了好久
1 | import os |
utils.py
1 | import os, random |
1.爆破proof_of_work:
1 | import string |
2.代码审计:
关键在这个函数:
1 | def task_bit(bit: int, n: int): |
如果 bit 是 0,那么第一个字符是一个 printable ,意味着首位一定是 0
即使经过 RSN 过程随机打乱,其是 0 的概率也会大于 bit=1 的情况
(据学长说后面还有需要考虑的地方,但是感觉有点复杂,回头再看)
这里直接粘 NKCTF 第一名的 WP
exp:
1 | from pwn import remote, context, log, process |
5.fly to the hyper
1 | from Crypto.Util.number import * |
可以根据论文求解亏格为 2 且基域为 GF(2) 的超椭圆曲线的阶:
https://www.math.uwaterloo.ca/~ajmeneze/publications/hyperelliptic.pdf
1 | from sage.all import * |
(后续的再学一学再更)
Misc:
1.signin
签到得(没抢到一血)
base64 解一下:d3jlhbPms6jlhazkvJflj7fvvJrnjI7liIPlrp7pqozlrqTvvIzlj5HpgIHlj6Pku6QgTktDVEYyMDI0X3NpZ25Jbg==
发公众号就行
1 | flag:nkctf{hell0_w41coMe_2_NKCTF_2024} |
2.Webshell_pro
队友看了每一个返回包并获取了信息,我负责通过 RSA 过程解决返回包中的加密
1 | //1 whoami |
解密脚本:
1 | import base64 |
解得
1 | b'whoami' |
发现一串: U2FsdGVkX1+SslS2BbHfe3c4/t/KxLaM6ZFlOdbtfMHnG8lepnhMnde40tNOYjSvoErLzy0csL7c5d4TlMntBQ
密钥为Password-based-encryption
AES解密得flag
1 | flag:NKCTF{d0e1183c-07c3-49ea-b048-addbe6cc1b20} |
3.Minecraft:SEED
题目过程:打mod:
seedcrackerX
然后就是跑图
…
1 | flag:NKCTF{07efe5eb-318e-486a-8c1c-6fc9304c6b16} |
4.world.execute.me
构造payload:
1 | echo $HEART;echo ; |
即可
1 | NKCTF2024{Then_1_c4n_b3_y0ur_only_EXECUTION} |
5.ctf80
想办法使五种语言都可运行,这个题我们队最后一个小时开始冲,只过了两关,没时间了。
1 |
|
1 | #/*<?php echo "tanji"; __halt_compiler();?> */ |
wp 的 payload 构造的非常巧妙
第一关:通过其中的 C++ 代码输出 “Cain”
第二关:使用C语言输出 “crazyman”
第三关:(当时想了好久都没想出来)可以利用不同语言的注释符的不同,嵌入PHP语言
第四、五关:思路同上
(先就这样吧)