July 19, 2024

OpenSSL command line tool to generate a self signed certificate.

创建 san.cnf 配置文件,用于定义证书的详细信息,包括国家、组织、域名等。 定义扩展属性,如 subjectAltName。 [ req ] default_bits = 256 default_md = sha256 default_keyfile = key.pem prompt = no encrypt_key = no distinguished_name = dn req_extensions = req_ext x509_extensions = v3_ca [ dn ] C=HK ST=Hong Kong L=Hong Kong O=Example Organization OU=IT Department [email protected] CN = example.hk [ req_ext ] subjectAltName = @alt_names [ v3_ca ] subjectAltName = @alt_names [ alt_names ] IP.1 = 192.168.1.1 DNS.1 = example.hk 生成 ECDSA 私钥: openssl ecparam -genkey -name prime256v1 -out ecdsa_private.key 生成证书签名请求 (CSR): openssl req -new -key ecdsa_private.key -out ecdsa.csr -config san.cnf 生成自签名证书: openssl x509 -req -in ecdsa.csr -signkey ecdsa_private.key -out ecdsa_certificate.crt -days 365 -extensions v3_ca -extfile san.cnf 自签名 ECDSA 证书和私钥就生成完成了
Read more
July 15, 2024

It happened after Ubuntu Auto-Remove iproute2

上文配置好 Nix 管理后(还没完全发布),有些洁癖,就用 apt 卸载掉部分基础包,同时执行 apt auto-remove。这时习惯性 reboot 后发现 ssh 连接失败,控制台重启系统也还是不行。无奈,用 KVM 提供的 VNC 上去看看。但并不能复制
Read more
July 14, 2024

My Nix Journey - Use Nix on Ubuntu

多平台多系统的版本控制工具(?),且能在不破坏环境变量的情况下临时加载程序 / 安装 Nix 我选择非官方安装程序安装 / curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install Nix commands nix search 搜索包在此WebSite搜索,但在终端中也许会更方便。例如,我要搜索 fish / nix search nixpkgs fish 更精准的搜索(多加几个关键词)
Read more
July 4, 2024

小众点评

老蕃享 | 人均 20 RMB 依托,又贵又难吃 麦当劳 | 人均 22 RMB 麦门,神中神 肆同粥铺 | 人均 14 RMB 偶尔会有免费的粥喝(多在晚上非饭点),下班较早 热干面八块,大份11(周边最便宜的面店) 好+多 手工面 | 人均 20 RMB 开在便利店里,周围唯一一家陕西面店,店主关门不干了(肉夹馍不好吃,油泼面还行)小贵 KFC | 人均 23 RMB 不多说,也是神,但周四人真是太多了 Dicos | 人均 18 RMB 炸鸡不错,但打包后的手提袋如果要的话 0.3 RMB 一个 零食有鸣 | 人均 NaN RMB 买水挺便宜,散装零食不如打开淘宝点击天猫超市 米由米拌饭馆 | 人均 26 RMB 依托,但能吃,就是量太少,米饭还行
Read more
July 4, 2024

旅游相关的一些 list

提前了解目的地法律规定 / HK 流量在旅游的时候是最不值钱的(提前买流量顶多一天50RMB),落地买卡也 OK。 / 大型公共区域(比如地铁站)有公共免费 WiFi,连上免费几十分钟,可以作为没有提前买流量的后悔药。
Read more
July 1, 2024

复盘 -- 作为生活日记

2024 6.30 NTRU 还是不太会配平 / 没有提交 密码挑战赛 解答有点难过,但自己也确实没啥贡献 / 还得多学原理,随缘师傅说的是对的,我目前最重要的不是去学习新知识,而是巩固已有的知识
Read more
June 14, 2024

CryptoCTF 2024 部分WriteUp

Bada Points: 90 / Solve: 51 / Difficulty: Medium 🤔 / 题面 Bada The Bada equation contains an undetermined function. By closely examining how this equation behaves, you may be able to discover the concealed flag. / nc 00.cr.yp.toc.tf 17113 Note: There is no file to download in this challenge! / 尝试交互 > nc 00.cr.yp.toc.tf 17113 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ Hey! It's time to solve the equation of a function f: N x N -> Z. ┃ ┃ Function f has given certain conditions. In each step, solve the ┃ ┃ equation f(x, y) = z with the given value of z. We know f(a+1, b) = ┃ ┃ f(a, b) + a, and f(a, b+1) = f(a, b) - b, for every `a' and `b'. ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┃ We know: f(1, 1) = -444045537086 and f(x, y) = 202500187503 ┃ Please send x, y separated by comma: 概述 通过将 $f(x, y) - f(1, 1) = n$ 转换成一个因式分解的问题,然后用这种分解来求解 $x$ 和 $y$ 的值。可以有效利用 $n$ 的因子来找到可能的 $x$ 和 $y$
Read more
June 6, 2024

趣题分享[4] -- 分组密码 相关题目

题面 from Crypto.Util.number import long_to_bytes, bytes_to_long from Crypto.Cipher import AES from Crypto.Util import Counter from hashlib import sha256 import os # from secret import flag flag = b'flag{test}' def padding(msg): return msg + os.urandom(16 - len(msg) % 16) # 随机值填充 msg = b"where is the flag? Key in my Heart/Counter!!!!" key = b"I w0nder how????" assert len(msg) == 46 assert len(key) == 16 enc_key = os.urandom(16) # 随机key initial_value = bytes_to_long(enc_key) # key转为整数 hash = sha256(str(initial_value).encode()).hexdigest() # 字符串(key) 的 sha256 aes = AES.new(enc_key,AES.MODE_ECB) enc_flag = aes.encrypt(padding(flag)) # 16 * 8 = 128, # {'counter_len': 16, 'prefix': b'', 'suffix': b'', 'initial_value': 1, 'little_endian': False} ctr = Counter.new(AES.block_size * 8, initial_value = initial_value) # print(ctr) aes = AES.new(key, counter = ctr, mode = AES.MODE_CTR) # key 已知, 推 counter, CTR mode 不需要 padding enc = aes.encrypt(msg) # msg 已知 # print("enc = {}".format(len(enc))) # 46 print("enc = {}".format(enc[-16:])) # 密文的最后16位, 但并不是最后一个 block print("enc_flag = {}".format(enc_flag)) print("hash = {}".format(hash)) Data enc_last16 = b'\xbe\x9bd\xc6\xd4=\x8c\xe4\x95bi\xbc\xe01\x0e\xb8' enc_flag = b'\xb2\x97\x83\x1dB\x13\x9b\xc2\x97\x9a\xa6+M\x19\xd74\xd2-\xc0\xb6\xba\xe8ZE\x0b:\x14\xed\xec!\xa1\x92\xdfZ\xb0\xbd\xb4M\xb1\x14\xea\xd8\xee\xbf\x83\x16g\xfa' hash = 'efb07225b3f1993113e104757210261083c79de50f577b3f0564368ee7b25eeb' Solution # Reference: # https://wumansgy.github.io/2018/11/03/AES%E7%9A%84CTR%E6%A8%A1%E5%BC%8F%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86%E8%AF%A6%E8%A7%A3/ # https://blog.csdn.net/XiongSiqi_blog/article/details/131931066 from Crypto.Util.number import long_to_bytes, bytes_to_long from Crypto.Cipher import AES from Crypto.Util import Counter from hashlib import sha256 import os # from secret import flag flag = b'flag{test}' def padding(msg): return msg + os.urandom(16 - len(msg) % 16) # 随机值填充 msg = b"where is the flag? Key in my Heart/Counter!!!!" key = b"I w0nder how????" assert len(msg) == 46 assert len(key) == 16 enc_key = os.urandom(16) # 随机key initial_value = bytes_to_long(enc_key) # key转为整数 hash = sha256(str(initial_value).encode()).hexdigest() # 字符串(key) 的 sha256 aes = AES.new(enc_key,AES.MODE_ECB) enc_flag = aes.encrypt(padding(flag)) # 16 * 8 = 128, # {'counter_len': 16, 'prefix': b'', 'suffix': b'', 'initial_value': 1, 'little_endian': False} ctr = Counter.new(AES.block_size * 8, initial_value = initial_value) print(ctr) aes = AES.new(key, counter = ctr, mode = AES.MODE_CTR) # key 已知, 推 counter, CTR mode 不需要 padding enc = aes.encrypt(msg) # msg 已知 # print("enc = {}".format(len(enc))) # 46 print("enc = {}".format(enc[-16:])) # 密文的最后16位, 但并不是最后一个 block print("enc_flag = {}".format(enc_flag)) print("hash = {}".format(hash)) print('题目数据输出结束' + ' *' * 16) # Data enc_last16 = b'\xbe\x9bd\xc6\xd4=\x8c\xe4\x95bi\xbc\xe01\x0e\xb8' enc_flag = b'\xb2\x97\x83\x1dB\x13\x9b\xc2\x97\x9a\xa6+M\x19\xd74\xd2-\xc0\xb6\xba\xe8ZE\x0b:\x14\xed\xec!\xa1\x92\xdfZ\xb0\xbd\xb4M\xb1\x14\xea\xd8\xee\xbf\x83\x16g\xfa' hash = 'efb07225b3f1993113e104757210261083c79de50f577b3f0564368ee7b25eeb' # Solution # a = msg[32:] # 从明文index 32 开始 a = msg[16 * (len(msg) // 16):] # 取最后一个 block b = enc_last16[16 - (len(enc) % 16):] # 从密文index 2 开始 | 选最后一个 block # 加密最后步骤 明文 xor enc_{key}(counter) = 密文 # 解密最后步骤 enc_{key}(counter) xor 密文 = 明文 | enc_{key}(counter) = 密文 xor 明文 enc_Counter1 = bytes(a[i] ^ b[i] for i in range(14)) for i in range(0xff): for j in range(0xff): # ECB mode 要求数据长度与块长对齐, 而加密后的数据的最后 2 bytes 我们并不清楚, 所以我们需要尝试所有的可能 enc_Counter2 = enc_Counter1 + bytes([i]) + bytes([j]) aes = AES.new(key,AES.MODE_ECB) Counter = aes.decrypt(enc_Counter2) # E_{key}(Counter) = Counter_enc | Counter = D_{key}(Counter_enc) initial_value = bytes_to_long(Counter) - (len(msg) // 16) # 经历两个 block, 最后一个 block 的 Counter - block 数 = 初始值 if hash == sha256(str(initial_value).encode()).hexdigest(): # type: str print(f'found {initial_value = }') enc_key = long_to_bytes(initial_value) aes = AES.new(enc_key,AES.MODE_ECB) flag = aes.decrypt(enc_flag) print(flag) break # flag{9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d}
Read more
April 12, 2024

Xcode 命令行工具管理

安装 Command Line Tools 版本 / xcode-select --install 或者 App Store 安装 Xcode / 显示当前生效的 Xcode 版本 / xcode-select --print-path 切换至 Xcode App Store 版本 / sudo xcode-select -s /Applications/Xcode.app/Contents/Developer 切换至 Command Line Tools 版本 / sudo xcode-select -s /Library/Developer/CommandLineTools
Read more
April 11, 2024

配置 MitMProxy

mitmproxy文档 / brew install mitmproxy # baidu_mitm.py # Demo # 导入 mitmproxy 的 http 模块 from mitmproxy import http # 请求处理函数 def request(flow: http.HTTPFlow) -> None: # 检查请求的主机是否为 'baidu.com' if "baidu.com" in flow.request.pretty_host: # 打印请求的 URL print(f"Request URL: {flow.request.url}") # 响应处理函数 def response(flow: http.HTTPFlow) -> None: # 检查请求的主机是否为 'baidu.com' if "baidu.com" in flow.request.pretty_host: # 打印响应的状态码 print(f"Response Status: {flow.response.status_code}") 浏览器配置忽略证书错误并设置代理为 127.0.0.1:8080
Read more