ctfshow-新手杯

先贴一贴官方wp

国庆放假摆得太厉害,忘记了还有比赛,放完后赶紧回来补一补

crypto4 新手村难度

贴贴题目

from Crypto.Util.number import *
from sympy import totient as phi
import sys
import randomdef pr(x, end='\n'):sys.stdout.write(f'{x}{end}')sys.stdout.flush()def newbie(naive, p):if (len(naive) == 0):return 1NB = 1PH = phi(p) # AAHPHfor i in range(len(naive)-1, -1, -1):if (NB > 4396): # clearlove picked the blind monkreturn pow(naive[0], int(newbie(naive[1:], PH) + PH), int(p))NB = naive[i] ** NBreturn NB % pBANNER = '''
+-------------------+
|     *             |
|     **     ****** |
|  ******** ******* |
|  ******** ***     |
|   *    ** ***     |
|    *  *** ***     |
| *************     |
| ***************** |
|     **    ******* |
|     **    *** **  |
|  ******** *** **  |
|     **    *** **  |
|   * ****  *** **  |
|  ** ** ** **  **  |
|  *  **  ****  **  |
| **  **   ***  **  |
|   ****  **    **  |
|                   |
+-------------------+比赛名称:新手杯
比赛时间:2022年10月3日20时,共48小时
比赛类型:个人赛
比赛难度:新手村难度
比赛奖品:神兽抱枕(女用)
题目投稿:ctfshow@163.com
投稿奖品:神兽抱枕(男用)
投稿截止:10月1日20时
'''pr(BANNER)p = getPrime(64)
while True:p = getPrime(64)if (p % 15 == 2):breakwith open('flag.txt', 'rb') as f:flag = f.read()
flag = f'0{bytes_to_long(flag):b}'pr(f'{p = }')
pr(f'{len(flag) = }')
while True:pr('> ', end='')seed = int(input())random.seed(seed)newbie_flag = list(flag)random.shuffle(newbie_flag)sometimes_naive = [int(x) * 2 + 3 for x in newbie_flag]pr(f'{newbie(sometimes_naive, p) = }')

对照着官方 w p wp wp一顿复现,结果发现 w p wp wp都没怎么看得懂,没想通二次剩余是怎么用的,终究还是我太菜了

先瞅瞅题目整个流程(简化题目,简化问题)

对 f l a g flag flag的操作:将 f l a g flag flag转成0/1的比特流,然后用 r a n d o m . s h u f f l e ( ) random.shuffle() random.shuffle()打乱顺序,接着将 ( 0 , 1 ) (0,1) (0,1)分别映射到 ( 3 , 5 ) (3,5) (3,5)上,最后丢到 n e w b i e ( ) newbie() newbie()里面去

再瞧瞧 n e w b i e ( ) newbie() newbie()函数:不如看 w p wp wp分析,我讲不出什么名堂来,不过可以确定的是 n e w b i e ( ) newbie() newbie()函数的返回值是 S 0 S 1 S_0^{S_1} S0S1​​,看得更简单些就是 3 2 ∗ k + 1 3^{2*k+1} 32∗k+1或 5 2 ∗ k + 1 5^{2*k+1} 52∗k+1

【提示】crypto4 提示为:幂次必为奇数

我自己的想法是既然幂次必为奇数,那么如果 3 2 ∗ k + 1 3^{2*k+1} 32∗k+1或 5 2 ∗ k + 1 5^{2*k+1} 52∗k+1再乘以底数,幂次就变成了偶数( 2 ∗ k + 2 2*k+2 2∗k+2),这样就可以很合理地有限域开方。如果乘 3 3 3以后能开出来那么底就是 3 3 3,那个 b i t bit bit就为 0 0 0了…这样就求出了第一位的值

利用 s h u f f l e shuffle shuffle来让不同位置的都变成 a 0 a_0 a0​来得到所有bit的值

题目需要输入 s e e d seed seed,可以控制这样的伪随机,多变变 s e e d seed seed来得到所有位置bit的值

先贴贴exp1

p % 4 != 3会挂掉,要重新跑,懒得写while true try了,将就用吧

拿带pwntools的sage跑,如果sage里面没有pwntools可以分两段,先拿有pwntools的python拿下newbie的值,然后再用sage

#!usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2022/10/8 19:20
# @Author  : mxx307
# @FileName: newbie.py
# @Software: PyCharmimport random
import tqdm
from pwn import *
from Crypto.Util.number import *re = remote('pwn.challenge.ctf.show', 28104)
tmp = re.recvuntil(b'p = ')
p = int(re.recvline().decode()[:-1])
if p % 4 != 3:re.close()exit()
tmp = re.recvuntil(b'len(flag) = ')
flag_len = int(re.recvline().decode()[:-1])
print(p,flag_len)
# flag_len = 368
flag = [-1 for i in range(flag_len)]
# C = []
INDEX = []
SEED = []
seed = 0
while len(SEED) != flag_len:random.seed(seed)randlist = list(range(flag_len))random.shuffle(randlist)indexx = list(range(flag_len)).index(randlist[0])if indexx not in INDEX:INDEX.append(indexx)SEED.append(seed)seed += 1
assert len(SEED) == flag_len
for i in tqdm.tqdm(range(len(SEED))):tmp = re.recvuntil(b'> ')re.sendline(str(SEED[i]).encode())tmp = re.recvuntil(b'newbie(sometimes_naive, p) = ')c = int(re.recvline().decode()[:-1])# C.append(c)PR.<x> = Zmod(int(p))[]f1 = x * x - 3 * cf2 = x * x - 5 * cres1 = f1.roots()res2 = f2.roots()if res1 and res2 == []: flag[INDEX[i]] = 0elif res1 == [] and res2: flag[INDEX[i]] = 1if flag.count(-1) == 0:flag = [str(i) for i in flag]print(long_to_bytes(int(''.join(flag),2)))break
re.close()# print(f'{C = }')
# from Crypto.Util.number import *
# flag = [-1 for i in range(flag_len)]
# for i in range(len(C)):
#     c = C[i]
#     PR.<x> = Zmod(int(p))[]
#     f1 = x * x - 3 * c
#     f2 = x * x - 5 * c
#     res1 = f1.roots()
#     res2 = f2.roots()
#     if res1 and res2 == []: flag[INDEX[i]] = 0
#     elif res1 == [] and res2: flag[INDEX[i]] = 1
#     if flag.count(-1) == 0:
#         flag = [str(i) for i in flag]
#         print(long_to_bytes(int(''.join(flag),2)))
#         break

写 w p wp wp回过头来思考二次剩余怎么用上去(数论没学好)

根据 w p wp wp,若有 p ≡ 3 ( m o d 4 ) p\equiv3\ (mod\ 4) p≡3 (mod 4),那么 ( 3 p ) = 1 (\frac{3}{p})=1 (p3​)=1,即 3 3 3是模 p p p的二次剩余。既然 3 3 3是二次剩余,那么 3 k 3^k 3k呢?那必须也得是啊,无论 k k k是奇数还是偶数,那么意味着 3 2 ∗ k + 1 3^{2*k+1} 32∗k+1可以被有限域开方求根,但是 5 2 ∗ k + 1 5^{2*k+1} 52∗k+1不行(所以用上面那个exp直接对c开方,能开出来就是3,开不出来就是5,这样也能求,对开方情有独钟)

再想想有没有啥办法不求根就能判断是否为二次剩余呢?

嗯~ o( ̄▽ ̄)o,我想不到,于是

随便找了一篇,看到了Euler判别准则(欧拉准则)

对于奇素数 p p p和 p ∤ a p\nmid a p∤a( p p p不能被 a a a整除)有
a ( p − 1 ) / 2 ≡ ( a p ) ≡ { 1 ( m o d p ) , 若 x 2 ≡ a ( m o d p ) 有解 − 1 ( m o d p ) , 若 x 2 ≡ a ( m o d p ) 无解 a^{(p-1)/2} \equiv \left(\frac{a}{p}\right) \equiv \left\{\begin{aligned}1\ (mod\ p) ,若x^2\equiv a\ (mod\ p)有解 \\-1\ (mod\ p),若x^2\equiv a\ (mod\ p)无解\end{aligned} \right. a(p−1)/2≡(pa​)≡{1 (mod p),若x2≡a (mod p)有解−1 (mod p),若x2≡a (mod p)无解​
判断是否为二次剩余确定是 3 3 3还是 5 5 5

酱紫就简单了些,可能这才是预期解吧(maybe)

最喜欢春哥出的题目辣,每次都能学到很多,这次学到了二次剩余+欧拉准则+高斯二次互反律

春哥yyds

贴贴expplus

p % 4 != 3会挂掉,要重新跑,懒得写while true try了,将就用吧

#!usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2022/10/9 13:29
# @Author  : mxx307
# @FileName: expplus.py
# @Software: PyCharmimport random
import tqdm
from pwn import *
from Crypto.Util.number import *re = remote('pwn.challenge.ctf.show', 28105)
re.recvuntil(b'p = ')
p = int(re.recvline().decode()[:-1])
if p % 4 != 3:re.close()exit()
re.recvuntil(b'len(flag) = ')
flag_len = int(re.recvline().decode()[:-1])
print(p, flag_len)
flag = [-1 for i in range(flag_len)]
INDEX = []
SEED = []
seed = 0
while len(SEED) != flag_len:random.seed(seed)randlist = list(range(flag_len))random.shuffle(randlist)indexx = list(range(flag_len)).index(randlist[0])if indexx not in INDEX:INDEX.append(indexx)SEED.append(seed)seed += 1
assert len(SEED) == flag_len
for i in tqdm.tqdm(range(len(SEED))):re.recvuntil(b'> ')re.sendline(str(SEED[i]).encode())re.recvuntil(b'newbie(sometimes_naive, p) = ')c = int(re.recvline().decode()[:-1])check = pow(c, (p - 1) // 2, p)flag[INDEX[i]] = 0 if check == 1 else 1
flag = [str(i) for i in flag]
print(long_to_bytes(int(''.join(flag), 2)))re.close()

ctfshow-新手杯-crypto4新手村难度-wp相关推荐

  1. CTFSHOW新手杯MISC部分WriteUp

    引文 之前复现了CTFSHOW新人杯的WEB方向部分题目,今天就复现一下MISC为主的题目,可能有些读者不太明白MISC方向是什么意思,简单来说就是"杂项",包括:隐写,压缩包处理 ...

  2. ctfshow新手杯wp

    最近国庆在疯玩的时候抽空做了几题,简单记录一下. 热身题目 打开题目发现,点击不了,打开F12控制台发现flag: 哇库哇库 题目是一个带密码的压缩包,提示说密码为纯大小写.用工具爆破了一下午没有结果 ...

  3. ctfshow 新手杯web

    easy_eval 拿到题目: <?phperror_reporting(0); highlight_file(__FILE__);$code = $_POST['code'];if(isset ...

  4. CTFshow月饼杯crypto部分wp

    CTFshow月饼杯crypto部分wp crypto 1 题目描述: 密文如下: 第一行给出为自动密码,搜索到相关文章下载break_autokey.py和相关的词频统计脚本,修改ctext跑一下发 ...

  5. ctfshow七夕杯

    ctfshow七夕杯misc海盗的密码WP 题目链接 题目描述 阿卜杜拉希.三哈.穆罕默德是一名来自索马里的海盗,当他不工作的时候,就喜欢窝在家里上上网,学学安全方面的知识. 听说他喜欢用ip地址做密 ...

  6. ctfshow单身杯

    目录 <1> web (1)签到(data协议) (2) easyPHP(awk执行命令) (3) 姻缘测试(ssti) (4) blog <2> Misc (1)misc签到 ...

  7. 盘古石杯电子取证比赛WP

    "盘古石杯"电子取证比赛WP 写在前面 刚刚比完了比赛,觉得自己还有很多东西没做过,现在趁着写WP的时候顺便复盘一下,望各位大佬指正. 2023年5月4日中午收到短信通知告诉我可以 ...

  8. 2019年第五届 美亚杯电子取证 团体赛 wp

    2019年第五届 美亚杯电子取证 团体赛 wp 案情 路由器 Win1.E01 Win3.E01 L:\Group_Competition\Hacker_Linux\Linux1 MacBookAir ...

  9. CTFshow 击剑杯 部分WP

    摆烂了摆烂了 太难了 聪明的师傅已经组队打起月赛了 试试能不能苟住前5 苟住了 复现的后面再补充吧 文章目录 1.Misc 中文识别带师 2.Web 简单的验证码 easyPOP 3.Pwn pwn0 ...

最新文章

  1. 2016 linux发行版排行_灵越7590 安装 linux (manjaro-gnome)
  2. Android客户端捕获http请求包的方法
  3. 根据gtf格式的基因注释文件得到人所有基因的染色体坐标
  4. 美国在理论计算机科学的研究重视,留学热门专业计算机之研究方向篇
  5. 6.Random Forests
  6. mysql - 内存表使用总结
  7. 揭牌!国字头高校正式落户南京!
  8. Oracle数据库 invalid character问题解决
  9. android studio for android learning (五) 最新Activity理解与其生命周期
  10. 思科模拟器-实验 18 三层交换访问控制列表配置
  11. 剑指offer | 面试题54:二叉搜索树的第k大节点
  12. hadoop2.9安装及配置_阿里云服务器上装Hadoop的心得(内附Hadoop2.9.2详细安装教程)...
  13. 2020年2月全国程序员工资统计,平均工资13716元
  14. “内存不能为read/written”是什么原理?
  15. python易盾滑动验证码
  16. 天嵌i.mx6q开发板android4.3编译问题
  17. JS复制文本到粘贴板,前端H5移动端点击按钮复制文本到粘贴板。
  18. Python .csv转Excle数据(csv数据为空格分割)
  19. 2021年江苏省高考成绩排名查询,2021年江苏高考分数一分一段位次表,江苏高考个人成绩排名查询方法...
  20. iptables之raw表

热门文章

  1. 碧蓝航线服务器维护go,《碧蓝航线》2月27日临时维护公告
  2. 【TiDB 4.0 新 Feature 原理及实践】 Dashboard 触手体验
  3. PotPlayer:不支持S/W HEVC(H265)解码 的解决办法
  4. BUAA-OO 第一单元总结
  5. Eclipse p2是什么
  6. [搬运]什么叫幂等性?
  7. latex 显示行号
  8. Layui数据表格请求添加参数
  9. 熊海CMS网站SQL注入、XSS攻击、cookie篡改
  10. 示波器x1档与x10档的区别