RSA算法题
URL:https://buuoj.cn/challenges#rsa
RSA基本步骤
- 选择两个大素数p和q,计算出模数N = p * q
- 计算φ = (p−1) * (q−1) 即N的欧拉函数,然后选择一个e (1<e<φ),且e和φ互质
- 取e的模反数为d,计算方法: e * d ≡ 1 (mod φ)
- 对明文m进行加密:c = pow(m, e, N),得到的c即为密文
- 对密文c进行解密,m = pow(c, d, N),得到的m即为明文
简单整理
- p和q:大整数N的两个因子factor
- N:大整数被称为模数modulus
- e和d:互为模反数的两个指数exponent
- c和m:分别指密文和明文,这里一般是十进制数
便得到了公钥$(N,e)$和私钥$(N,d)$解题
- 提取公钥,将
pub.key
拖到在线网站得到e = 65537
N=86934482296048119190666062003494800588905656017203025617216654058378322103517 - 解析公钥,在因子库内查询得到
p = 285960468890451637935629440372639283459
q = 304008741604601924494328155975272418463 - 脚本解密
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16import gmpy2
import rsa
e = 65537
n = 86934482296048119190666062003494800588905656017203025617216654058378322103517
p = 285960468890451637935629440372639283459
q = 304008741604601924494328155975272418463
phin = (q-1)*(p-1)
d = gmpy2.invert(e, phin)
key = rsa.PrivateKey(n, e, int(d), p, q)
with open("C:\\Users\\10245\\Desktop\\output\\flag.enc", "rb+") as f:
f = f.read()
print(rsa.decrypt(f, key))小结
- RSA算法应属于Crypto类型题目,这是最最基础的考法,基本不涉及算法知识
CrackRTF
URL: https://buuoj.cn/challenges#CrackRTF - RTF:Rich Text Format 富文本格式
解题步骤
- IDA打开反汇编,顺利得到代码进行分析
- 大致为三重验证:
- 六位数字后接
@DBApp
经算法加密后与6E32D0943418C2C33385BC35A1470250DD8923A9
- 六位字符后接1步骤加密前明文再经算法加密后与
27019e688a4e62a649fd99cadaafdb4e
匹配 - 上述明文异或
resource
内某字符串,如成功则出flag
- 六位数字后接
- 1/2步骤均调用了Win32API中的CryptCreateHash()函数,有一个难点是通过所给参数确定加密算法,需要仔细阅读相关文档
- 步骤1 识别为sha1算法,也可爆破/步骤2 识别为MD5算法,无法爆破:此处解法为到步骤3 中,用
ResourceHacker
检出目标字符串前六位,逆异或得到(不知道有无substitute - 最后启动程序输入两次密码得flag
- 耐心耐心耐心
py逆向
URL: https://buuoj.cn/challenges#[GWCTF%202019]pyre基本知识
- pyc字节码是由py文件编译时生成的中间文件,但一般不会在普通工程中出现。可由uncompyle6一键反编译
- 一些二进制文件打开后若出现喝多
py.
字符如节区命名,可能即是经过打包后的py工程文件,常见的有PyInstaller、Py2exe - 熟悉py语言,练习py脚本!!!!
- 使用命令
$ uncompyle6 {{file}} | out-file script.py
得到py文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# uncompyle6 version 3.7.3
# Python bytecode 2.7 (62211)
# Decompiled from: Python 3.7.7 (tags/v3.7.7:d7c567b08f, Mar 10 2020, 10:41:24) [MSC v.1900 64 bit (AMD64)]
# Embedded file name: encode.py
# Compiled at: 2019-08-19 21:01:57
print ('Welcome to Re World!')
print ('Your input1 is your flag~')
input1=input()
l = len(input1)
code=""
for i in range(l):
num = ((input1[i]+ i) % 128 + 128) % 128
code += chr(num)
for i in range(l - 1):
code[i] = code[i] ^ code[(i + 1)]
print (code)
code = ['\x1f', '\x12', '\x1d', '(', '0', '4', '\x01', '\x06', '\x14', '4', ',', '\x1b', 'U', '?', 'o', '6', '*', ':', '\x01', 'D', ';', '%', '\x13']
# okay decompiling .\attachment (1).pyc - 大意应该是输入flag 经两次循环加密后要等于
code
解题,
- 可以写C脚本,但自己python能力太弱了还是多练一下吧
1
2
3
4
5
6
7code = ['\x1f', '\x12', '\x1d', '(', '0', '4', '\x01', '\x06', '\x14', '4', ',', '\x1b', 'U', '?', 'o', '6', '*', ':', '\x01', 'D', ';', '%', '\x13']
l=len(code)
print('Welcome to Reverse!')
for x in range(l-2,-1,-1):
code[x]=chr(ord(code[x])^ord(code[x+1]))
for x in range(l):
print(chr((ord(code[x])-x)%128),end='') - 中间写出很多不忍直视的代码来,简单记一下:
- python字符串不可修改,和JS一样
- 取字符时用好ord()和chr()函数
{{list name}}[::-1]
和range(start,stop[,step])
的用法