CTF_re_81020

heacsing 发布于

RSA算法题

URL:https://buuoj.cn/challenges#rsa

RSA基本步骤

  1. 选择两个大素数p和q,计算出模数N = p * q
  2. 计算φ = (p−1) * (q−1) 即N的欧拉函数,然后选择一个e (1<e<φ),且e和φ互质
  3. 取e的模反数为d,计算方法: e * d ≡ 1 (mod φ)
  4. 对明文m进行加密:c = pow(m, e, N),得到的c即为密文
  5. 对密文c进行解密,m = pow(c, d, N),得到的m即为明文

    简单整理

  • p和q:大整数N的两个因子factor
  • N:大整数被称为模数modulus
  • e和d:互为模反数的两个指数exponent
  • c和m:分别指密文和明文,这里一般是十进制数
    便得到了公钥$(N,e)$和私钥$(N,d)$

    解题

  1. 提取公钥,将pub.key拖到在线网站得到

    e = 65537
    N=86934482296048119190666062003494800588905656017203025617216654058378322103517

  2. 解析公钥,在因子库内查询得到

    p = 285960468890451637935629440372639283459
    q = 304008741604601924494328155975272418463

  3. 脚本解密
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import 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打开反汇编,顺利得到代码进行分析
  • 大致为三重验证:
    1. 六位数字后接@DBApp经算法加密后与6E32D0943418C2C33385BC35A1470250DD8923A9
    2. 六位字符后接1步骤加密前明文再经算法加密后与27019e688a4e62a649fd99cadaafdb4e匹配
    3. 上述明文异或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
    7
    code = ['\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='')
  • 中间写出很多不忍直视的代码来,简单记一下:
    1. python字符串不可修改,和JS一样
    2. 取字符时用好ord()和chr()函数
    3. {{list name}}[::-1]range(start,stop[,step])的用法