首页 > 其他分享 >暑假第二周

暑假第二周

时间:2023-07-11 23:26:09浏览次数:35  
标签:tmp file 暑假 RSA flag 第二周 key import

Rev_Dizzy

xuenixiang.com上的一道题
F5 反编译失败提示
img
这里可以展开查看汇编代码
img
一种方法是直接手撸汇编代码,因为汇编代码中只有add,sub,xor三种操作,
可以尝试手撸汇编,或者交给Chat_GPT
搜索一番后学到还有一种解决方法
可以通过修改IDA配置文件\cfg\hexrays.cfg
将里面的MAX_FUNCSIZE改大一点例如1024
可以看到注释里面也说明了若函数大于64K的话会无法反汇编,所以我们将它改大
img
反汇编后逻辑很简单就是5000多行的加减异或操作后与密文比较
img
只需要将加替换成减,减替换成加然后倒着跑一遍密文就行
将加密的5000多行复制下来保存为data.txt
注意跑的时候要& 0xff防止溢出
用exec函数执行字符串代码

exp

with open('data.txt', 'rb') as fp:
    data = fp.read()
flag = [0x27,0x3C,0xE3,0xFC,0x2E,0x41,0x07,0x5E,0x62,0xCF,
        0xE8,0xF2,0x92,0x80,0xE2,0x36,0xB4,0xB2,0x67,0x77,
        0x0F,0xF6,0x0D,0xB6,0xED,0x1C,0x65,0x8A,0x07,0x53,
        0xA6,0x66]
fp1 = open("ans.txt", "w")
data = data.split(b'\n')
for i in data[::-1]:
    tmp = i[2:].decode()
    if '+' in tmp:
        tmp = tmp.replace('+', '-')
        code = tmp + '\n' + tmp[:tmp.find('-')] + "&= 0xff"
    elif '-' in tmp:
        tmp = tmp.replace('-', '+')
        code = tmp + '\n' + tmp[:tmp.find('+')] + "&= 0xff"
    else: code = tmp + '\n' + tmp[:tmp.find('^')] + "&= 0xff"
    fp1.write(tmp+'\n')
    exec(code)
fp1.close()
fp.close()
for i in flag:
  print(chr(i),end='')

flag

flag{Try_R3vers1ng_W1th_ScR!pt!}

[CatCTF]The cat did it

点进来很复杂一个函数图像,猫猫可爱捏
flag是CatCTF{MD5(我离开猫猫的概率)}
img
我的定义域是[-200,200]拖动一下我
可以发现无论怎么拖都有一部分是在猫猫体内的
所以猜测概率为0%,算一下md5
img

flag

CatCTF{9f1ef07877f9d85a82bd500f408b4814}

[BUUCTF]rsa

RSA介绍

RSA 加密算法是一种非对称加密算法。在公开密钥加密和电子商业中 RSA 被广泛使用。RSA 是 1977 年由罗纳德 · 李维斯特(Ron Rivest)、阿迪 · 萨莫尔(Adi Shamir)和伦纳德 · 阿德曼(Leonard Adleman)一起提出的。RSA 就是他们三人姓氏开头字母拼在一起组成的。
RSA 算法的可靠性由极大整数因数分解的难度决定。换言之,对一极大整数做因数分解愈困难,RSA 算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用 RSA 加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。如今,只有短的 RSA 密钥才可能被强力方式解破。到 2017 年为止,还没有任何可靠的攻击 RSA 算法的方式。

原理

公钥与私钥的生成

  • 随机选择两个不同的大质数 \(p\) 和 \(q\) 计算\(N = p \times q\)
  • 由欧拉函数\(\varphi(N)=\varphi(p)\varphi(q)=(p-1)(q-1)\)
  • 选择一个小于\(\varphi(N)\)的整数\(e\),使得\(e\)和\(\varphi(N)\)互质
  • 求\(e\)关于\(\varphi(N)\)的乘法逆元\(d\),即求满足\(ed=1(\text{mod}\enspace \varphi(N))\)
  • 将\(p\)和\(q\)的记录销毁
  • \((N,e)\)即为公钥,\((N,d)\)即为私钥

加密

首先需要将消息 以一个双方约定好的格式转化为一个小于\(N\),且与\(N\)互质的整数\(m\)。如果消息太长,可以将消息分为几段,这也就是我们所说的块加密,后对于每一部分利用如下公式加密:

\[m^{e}\equiv c(\text{mod}\enspace N) \]

解密

用d可以解密

\[c^{d}\equiv m(\text{mod}\enspace N) \]

解题过程

公钥解析

法一

在线公钥解析
img
在线分解质因数
img

法二

from Crypto.Util.number import *
from Crypto.PublicKey import RSA
import gmpy2
import rsa
from factordb.factordb import FactorDB

with open('pub.key','r') as f:
    key = RSA.import_key(f.read())
e = key.e
n = key.n
print('e = %d\nn = %d'%(e,n))
a = FactorDB(n)
a.connect()
fac = a.get_factor_list()
#或者factors = list(primefac.primefac(n))但是对大整数来说这个方法很慢
p,q = fac[0],fac[1]
print('p = %d\nn = %d'%(p,q))

解密

phi_n = (p-1)*(q-1)
d = gmpy2.invert(e, phi_n)
key = rsa.PrivateKey(p*q, e, d, p, q)

with open("flag.enc", 'rb') as file: 
    file = file.read()
    print(rsa.decrypt(file, key))  
#e = 65537
#n = 86934482296048119190666062003494800588905656017203025617216654058378322103517
#p = 285960468890451637935629440372639283459
#q = 304008741604601924494328155975272418463
#b'flag{decrypt_256}\n'

完整exp

from Crypto.Util.number import *
from Crypto.PublicKey import RSA
import gmpy2
import rsa
from factordb.factordb import FactorDB

with open('pub.key','r') as f:
    key = RSA.import_key(f.read())
e = key.e
n = key.n
print('e = %d\nn = %d'%(e,n))
a = FactorDB(n)
a.connect()
fac = a.get_factor_list()
p,q = fac[0],fac[1]
print('p = %d\nn = %d'%(p,q))
phi_n = (p-1)*(q-1)
d = gmpy2.invert(e, phi_n)
key = rsa.PrivateKey(p*q, e, d, p, q)

with open("flag.enc", 'rb') as file: 
    file = file.read()
    print(rsa.decrypt(file, key))  
#e = 65537
#n = 86934482296048119190666062003494800588905656017203025617216654058378322103517
#p = 285960468890451637935629440372639283459
#q = 304008741604601924494328155975272418463
#b'flag{decrypt_256}\n'

flag

flag{decrypt_256}

标签:tmp,file,暑假,RSA,flag,第二周,key,import
From: https://www.cnblogs.com/Tree-24/p/17546240.html

相关文章

  • 暑假周记(7.11)
    今天上午课程进行的不错,逐渐掌握这帮小孩的能力,开始适应他们的节奏,总之上午感觉很不错。下午,非常非常生气,有一个补习班的学生是我表妹,在上课的时候公然顶撞我,虽然已经过去了四个小时,我现在仍旧怒不可遏,舅舅跟舅妈简直把她惯坏了。......
  • CSP_J 暑假清北学堂集训 第一天
    数据结构:数据结构:1.怎么写;2.怎么用一、数组1.负数下标是可以定义的:1.变量局部开在栈空间里2.数组全局变量开在堆空间里3.数组越界会出现一些奇奇怪怪到小问题处理方法:inta[1000010];int*b=a+500000;结果:b[-233]->a[500000-233];b[-500000~500000];......
  • CSP_J 暑假清北学堂集训 第二天
    倍增算法:(只往上和)f[i][j]:从ai开始的2的j次方个数的最大值=max(ai+ai+1+......+ai+2^j-1)f[i][0]=ai//切一刀:f[i][j]=max(f[i][j-1],f[i+2^(j-1)][j-1])Q:一个区间内的最大值n<=100000思路:l=2,r=5f[2][2];如果恰好是2的次方......
  • CSP_J 暑假清北学堂集训
    图论:图的概念由点和边构成的元素边:如果边都有方向我们叫它有向图没方向叫无向图一、图的一些基本概念:1.度:一个顶点连了几条边就是它多少度2.有向图里的入度和出度:连向自己的度就是入度往外连得就是出度3.有向图里的自环:既是入度又是出度4.路径:只要沿着边走叫做路径如:1->2......
  • SMU 2023 Spring 题单 第二周 贪心
    Saruman'sArmy首先对序列排序,然后逐个考虑覆盖,如果要覆盖当前的点,则标记点越靠后越好,所有向后找\(R\),选择最靠后的标记,然后从标记点开始在向后找\(R\)也是被标记过的,直接跳过#include<cstdio>#include<algorithm>usingnamespacestd;intread(){intx=0,f=1......
  • CW暑假集训
    集训模拟赛的题解应该都在CWOI杂题里。主要就是题目的记录?不太想写游记。简单题不会写。7.7考试,考得依托。7.8很趣味的数据结构!感觉很有集训那味啊,就是前面讲一会简单的东西然后突然上强度。gym100739E.LifeasaMonster还是挺简单。套路地把切比雪夫距离转成曼哈顿......
  • 暑假周记(7.10)
    今天周一哇去,给两个年纪小孩上英语,还有一个小升初教语数英好累啊,哇,那些乡村支教的老师们是怎么做到的,我这个还是有着不错的工资的,我的上课条件也远比他们优越,感念这一帮伟大的老师,今天忙了一天就看了十页大道至简,倒是第一次玩游戏用上Java了----我的世界Java版本,Java真牛,一定得把......
  • 2023ACM暑假训练day 11 动态规划
    目录DAY11动态规划训练情况简介题题题题DAY11动态规划训练地址:传送门训练情况简介2023-07-1009:30:17星期一早上:下午:晚上:题题意:思路:题题意:思路:题题意:思路:题题意:思路:......
  • 暑假周记(7.9)
    周日,美妙的周日没什么特别的今天finalfinallyfinalize区别final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代......
  • 暑假!
    夏令营结束了,许多事情告一段落,又有许多事情准备开始进行。以后大概不会更博客了(flag先立在这里),或许也可以来上传一些不一样的?比如有点想学做菜,如果到时候能做出几个能吃的菜可以来发几张照片纪念一下……或者是去哪些城市玩,也可以拍几张风景照打卡留念一下。......