ciscn

2024-05-28 00:44
文章标签 ciscn

本文主要是介绍ciscn,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ciscn Crypto部分复现

古典密码

先是埃特巴什密码(这个需要进行多次测试),然后base64,再栅栏即可
答案:flag{b2bb0873-8cae-4977-a6de-0e298f0744c3}

_hash

题目:

#!/usr/bin/python2
# Python 2.7 (64-bit version)
# from secret import flag
import os, binascii, hashlib
key = os.urandom(7)
print(hash(key))
print(int(hashlib.sha384(binascii.hexlify(key)).hexdigest(), 16) ^ int(binascii.hexlify(flag), 16))
'''
7457312583301101235
13903983817893117249931704406959869971132956255130487015289848690577655239262013033618370827749581909492660806312017
'''

解题分析:

这个要查python2.7版本的hash函数实现源码(找不到啊/_ \),看了看wp

源码在这:py27哈希 ·PyPI的

分析一下实现原理

部分源码:if isinstance(value, tuple):return Hash.thash(value)if isinstance(value, float):return Hash.fhash(value)if isinstance(value, int):return hash(value)if isinstance(value, ("".__class__, u"".__class__, bytes)) or type(value).__name__ == "buffer":return Hash.shash(value) #要哈希的数是字符串则跳到shash函数
 def shash(value):length = len(value)if length == 0:return 0mask = 0xffffffffffffffffx = (Hash.ordinal(value[0]) << 7) & maskfor c in value:x = (1000003 * x) & mask ^ Hash.ordinal(c)x ^= length & mask# Convert to C long typex = ctypes.c_long(x).valueif x == -1:x = -2return x

所以hash函数实现的过程是:

def hash(s):mask = 0xffffffffffffffff#64位s = s.encode()x = s[0] << 7for char in s:x = (1000003 * x) & mask ^ charx ^= len(s) & maskreturn x

&mask即模2^64,用来限制位数大小的

那么hash过程写出来即:(key是7位的)
x 0 = s 0 ∗ 2 7 x_0=s_0 *2^7 x0=s027

x 1 = ( 1000003 ∗ x 0 ) m o d 2 64 ⊕ s 0 x_1=(1000003*x_0) \quad mod \quad 2^{64} \quad \oplus s_0 x1=(1000003x0)mod264s0

x 2 = ( 1000003 ∗ x 1 ) m o d 2 64 ⊕ s 1 x_2=(1000003*x_1) \quad mod \quad 2^{64} \quad \oplus s_1 x2=(1000003x1)mod264s1

x 3 = ( 1000003 ∗ x 2 ) m o d 2 64 ⊕ s 2 x_3=(1000003*x_2) \quad mod \quad 2^{64} \quad \oplus s_2 x3=(1000003x2)mod264s2

以此类推,最后得到:
x = x 7 ⊕ l e n g t h m o d 2 64 x=x_7 \oplus length \quad mod \quad 2^{64} x=x7lengthmod264
现在我们知道hash后的数值即x,需要推出x0,那么进行一个逆过程
x 7 = x ⊕ l e n g t h m o d 2 64 x_7=x \oplus length \quad mod \quad 2^{64} x7=xlengthmod264

x 6 = x 7 ⊕ s 2 ∗ 100000 3 − 1 m o d 2 64 x_6= x_7\oplus s_2*1000003^{-1} \quad mod \quad 2^{64} x6=x7s210000031mod264

依次类推,得到x:
x 0 = x 1 ⊕ s 0 ∗ 100000 3 − 1 m o d 2 64 x_0=x_1 \oplus s_0 *1000003^{-1} \quad mod \quad 2^{64} x0=x1s010000031mod264
但是我们只有key,s0-s7都是明文中的,所以这里有个中间相遇攻击

中间相遇攻击的思路在于,假设明文key是abcdefg

我们从前面加密4个字符,即加密到x4,并把他作为元组记录下来。

再把得到的密文从后面逆向,逆到x4,如果和前面的对应上了,即爆破出key

(不是很懂)

贴下别的师傅的脚本(还需要再看看,等我后面做个补充)

from itertools import product
from Crypto.Util.number import *
from tqdm import trangemask = 0xffffffffffffffff
inv = inverse(1000003,2**64)
x7 = 7457312583301101235
cipher = 13903983817893117249931704406959869971132956255130487015289848690577655239262013033618370827749581909492660806312017table = {}
for i in trange(256):# 这是第一个字符for tmp in product([i for i in range(256)],repeat=3):# 下面便是hash的实现,但是我们只乘上3个字符x = (i << 7) & mask                       x = (1000003 * x) & mask ^ ipre = list(tmp)for char in pre:x = (1000003 * x) & mask ^ chartable[x] = pre# 记录下来for tmp in product([i for i in range(256)],repeat=3):tail = list(tmp)x7 = (x7 ^ 7) & maskx6 = (x7 ^ tail[-1]) * inv & maskx5 = (x6 ^ tail[-2]) * inv & maskx4 = (x5 ^ tail[-3]) * inv & maskif x4 in table.keys():print(i,table[x4],tail)# 93 [140, 240, 63] [90, 8, 82]break

要跑2.5小时(震惊)

有了key,就直接异或回去即可

import hashlib
import binasciim = [93,140,240,63,90,8,82]
key = b""
for i in m:key += long_to_bytes(i)flag = long_to_bytes(int(hashlib.sha384(binascii.hexlify(key)).hexdigest(), 16) ^ cipher) 
print(flag)
# flag{bdb537aa-87ef-4e95-bea4-2f79259bdd07}

2024CISCN | DexterJie’Blog
后面的题我正在努力中

这篇关于ciscn的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1009060

相关文章

【华东南AWDP】第十七届全国大学生信息安全竞赛 CISCN 2024 创新实践能力赛区域赛 部分题解WP

前言:这次区域赛AWDP安恒作为支持,赛制风格遵循安恒,一小时check一次。室温35°在室内坐了8小时,午饭是藿香正气水拌冰水。这场总体下来中规中矩吧。 WEB-welcome-BREAK Ctrl+U拿到flag WEB-submit-BREAK 文件上传,简单绕过 绕过就两个,一个MIMA头,一个等号换php(短标签) WEB-submit-FIX 修两个点,一个是

2024全国大学生信息安全竞赛(ciscn)半决赛(西南赛区)Pwn题解

前言 前两天把华南赛区和东北赛区的Ciscn半决赛题目复现完了。 最近西南赛区半决赛也刚刚结束,找师傅要了Pwn题目,复现一下。 Pwn1-vuln 比较有意思的题目,构造很巧妙,call的函数地址指向栈顶变量地址。 使得我们可以构造16字节的read的shellcode实现任意大小shellcode读取。 逆向分析 签到题,程序逆向很简单,挺有意思的一个题目。拖入IDA分析:

CISCN 2022 初赛 ez_usb

还是从第一个 URB向后看 发现 同时 存在 2.8.1 2.10.1 2.4.1 但是显然 2.4.1 是7个字节 不满足 usb流量要求 只考虑 2.8.1 和 2.10.1 tshark -r ez_usb.pcapng -T json -Y "usb.src == \"2.8.1\"" -e usbhid.data > 281.json 正常取数据即可 import jsonwit

[CISCN 2018]sm

目录 1.题目 3.解题 4.参考 1.题目 题目链接 from Crypto.Util.number import getPrime,long_to_bytes,bytes_to_longfrom Crypto.Cipher import AESimport hashlibfrom random import randintdef gen512num():order=

【Web】记录CISCN 2023 西南半决赛 seaclouds题目复现

目录 原理速览 构造细节 EXP 原理速览 在Spring依赖下,可以触发jackson的BaseJsonNode#toString,从而调用getter,而后为所欲为 【Web】浅聊Jackson序列化getter的利用——POJONode_jackson 序列化时指定get方法 【Web】浅聊Java反序列化之Rome——关于其他利用链 至于如何调用toString,对

【Web】记录CISCN 2021 总决赛 ezj4va题目复现——AspectJWeaver

目录 前言 原理分析 step 0 step 1 EXP 前文:【Web】浅聊Java反序列化之AspectJWeaver——任意文件写入-CSDN博客 前言 这就是当年传说中的零解题嘛😭,快做🤮了 有了之前的经验,思路顺挺快的,中间不知道为啥一直一直一直一直报错,耗了一个下午总算打通 考的是AspectJWeaver写恶意字节码到靶机上(本题jsp靶机不解析),再

[CISCN 2019华东南]Web11

打开题目 看到xff就应该想到抓包 看回显也是127.0.0.1,我们盲猜是不是ssti模板注入 输入{{7*7}}显示49 可以看的出来flag在根目录下 输入{system(‘cat /flag’)} 得到flag 知识点: 漏洞确认 一般情况下输入{$smarty.version}就可以看到返回的smarty的版本号 得

[BUUCTF]-PWN:ciscn_2019_final_3解析

查看保护 RELRO保护为FULL,got表不可修改,只能修改hook表了 查看ida 这里的大致功能为alloc创建堆块(可填充内容)、free释放堆块(但是不清空指针) 值得注意的就是创建堆块大小不可以超过0x78(实际大小会对齐) 这里的libc版本要注意以下,它在题目中给了我们libc库,很巧妙的是这道题的版本选得很刁钻,只要稍微高一点的版本都用不了常规解法中的tcach

详细ciscn_2019_s_3题解

来了来了,我拖了好久,因为吧,之前做了个堆题,大概用了一周才做完,做完堆题,下一个题是栈的,我以为会很简单,但是对我来说很难诶。上才艺… (系统调用其他师傅都有写,我就不赘述啦啦啦啦啦),因为师傅们翻到我这里肯定对系统调用有了解了呀,我这么菜,只能在最下边呜呜呜。 1.拖入ida,反汇编(64位),注意到函数传参与32位会不同。 在函数框内发现vuln(大家应该对这种函数很熟悉了吧),还有gadg

ciscn_2019_s_9详解

checksec得知: 1、程序架构是 i386,32位,小端模式 2、got表可读可写 3、没有启用栈保护 4、栈中数据有执行权限 5、未启用位置无关可执行文件 6、存在可读可写可执行段 执行程序,要求输入字符串。 使用ida pro 反汇编 按f5生成伪代码 main函数调用了函数pwn(),双击函数pwn进入, pwn函数定义了字符数组s,大小为24,位于离栈顶8h,栈