buuctf续

rot

题目是rot,打开之后是一串数字,有可能是ASCII码,但是这个数超过了127,所以肯定要减一些数。

题目rot就是一种提示,rot系列

ROT5、ROT13、ROT18、ROT47 编码是一种简单的码元位置顺序替换暗码。此类编码具有可逆性,可以自我解密,主要用于应对快速浏览,或者是机器的读取,而不让其理解其意。
 
ROT5 是 rotate by 5 places 的简写,意思是旋转5个位置,其它皆同。下面分别说说它们的编码方式:
ROT5:只对数字进行编码,用当前数字往前数的第5个数字替换当前数字,例如当前为0,编码后变成5,当前为1,编码后变成6,以此类推顺序循环。
ROT13:只对字母进行编码,用当前字母往前数的第13个字母替换当前字母,例如当前为A,编码后变成N,当前为B,编码后变成O,以此类推顺序循环。
ROT18:这是一个异类,本来没有,它是将ROT5和ROT13组合在一起,为了好称呼,将其命名为ROT18。
ROT47:对数字、字母、常用符号进行编码,按照它们的ASCII值进行位置替换,用当前字符ASCII值往前数的第47位对应字符替换当前字符,例如当前为小写字母z,编码后变成大写字母K,当前为数字0,编码后变成符号_。用于ROT47编码的字符其ASCII值范围是33-126,具体可参考ASCII编码。

 将数字都对应减去13,后按照ASCII码转成字符串

s = '83 89 78 84 45 86 96 45 115 121 110 116 136 132 132 132 108 128 117 118 134 110 123 111 110 127 108 112 124 122 108 118 128 108 131 114 127 134 108 116 124 124 113 108 76 76 76 76 138 23 90 81 66 71 64 69 114 65 112 64 66 63 69 61 70 114 62 66 61 62 69 67 70 63 61 110 110 112 64 68 62 70 61 112 111 112'
l = s.split(" ")
for i in l:
    print(chr(int(i)-13),end='')

输出

FLAG IS flag{www_shiyanbar_com_is_very_good_????}
MD5:38e4c352809e150186920aac37190cbc

flag后面有四个问号,还给出了md5的值,说明后四位需要自己爆破

MD5值提示我们爆破成功的条件就是,真正的flag对应的MD5值要与给出的MD5相等。

import hashlib
d = 'flag{www_shiyanbar_com_is_very_good_'
c = '38e4c352809e150186920aac37190cbc'
for i in range(32, 126):
    for j in range(32, 126):
        for k in range(32, 126):
            for m in range(32, 126):
                l = d + chr(i) + chr(j) + chr(k) + chr(m) + '}'
                h = hashlib.md5(l.encode('utf8')).hexdigest()
                if c == h:
                    print(l)
                    exit()

 这个爆破需要消耗一些时间,大约一分钟左右。

flag{www_shiyanbar_com_is_very_good_@8Mu}

childRSA 

拿到题之后有c和e,就想着要将n分解,发现n很大,分解不太合适,所以肯定不是分解之后解密那么简单,分析一下题目中的代码,我们是要得到p和q的值,getPrime函数就是在生成p和q,primes是前10000个素数的列表,p,q就是在前10000个素数列表里面随机找几个素数相乘再加一得到的,所以这10000个素数的乘积x是p-1和q-1的倍数,x=k*(p-1),n=p*q,这里就要从n和x得到p。

这里要用到一个费马小定理

费马小定理(Fermat's little theorem)是数论中的一个重要定理,在1636年提出。如果p是一个质数,而整数a不是p的倍数,则有a^(p-1)≡1(mod p)。

借鉴大佬的代码

import gmpy2
import libnum
from Crypto.Util.number import isPrime, sieve_base as primes
c = 26308018356739853895382240109968894175166731283702927002165268998773708335216338997058314157717147131083296551313334042509806229853341488461087009955203854253313827608275460592785607739091992591431080342664081962030557042784864074533380701014585315663218783130162376176094773010478159362434331787279303302718098735574605469803801873109982473258207444342330633191849040553550708886593340770753064322410889048135425025715982196600650740987076486540674090923181664281515197679745907830107684777248532278645343716263686014941081417914622724906314960249945105011301731247324601620886782967217339340393853616450077105125391982689986178342417223392217085276465471102737594719932347242482670320801063191869471318313514407997326350065187904154229557706351355052446027159972546737213451422978211055778164578782156428466626894026103053360431281644645515155471301826844754338802352846095293421718249819728205538534652212984831283642472071669494851823123552827380737798609829706225744376667082534026874483482483127491533474306552210039386256062116345785870668331513725792053302188276682550672663353937781055621860101624242216671635824311412793495965628876036344731733142759495348248970313655381407241457118743532311394697763283681852908564387282605279108
n = 32849718197337581823002243717057659218502519004386996660885100592872201948834155543125924395614928962750579667346279456710633774501407292473006312537723894221717638059058796679686953564471994009285384798450493756900459225040360430847240975678450171551048783818642467506711424027848778367427338647282428667393241157151675410661015044633282064056800913282016363415202171926089293431012379261585078566301060173689328363696699811123592090204578098276704877408688525618732848817623879899628629300385790344366046641825507767709276622692835393219811283244303899850483748651722336996164724553364097066493953127153066970594638491950199605713033004684970381605908909693802373826516622872100822213645899846325022476318425889580091613323747640467299866189070780620292627043349618839126919699862580579994887507733838561768581933029077488033326056066378869170169389819542928899483936705521710423905128732013121538495096959944889076705471928490092476616709838980562233255542325528398956185421193665359897664110835645928646616337700617883946369110702443135980068553511927115723157704586595844927607636003501038871748639417378062348085980873502535098755568810971926925447913858894180171498580131088992227637341857123607600275137768132347158657063692388249513
e = 0x10001
x = 1
for i in primes:
    x = i * x
p = gmpy2.gcd(pow(2, x, n) - 1, n)
q = n // p
phi = (p - 1) * (q - 1)
d = gmpy2.invert(e, phi)
m = pow(c, d, n)
flag = libnum.n2s(int(m))
print(flag)

BUUCTF-childRSA费马小定理_T1M@的博客-CSDN博客_childrsa

 运行结果

 将结果用flag{}包上提交即可

flag{Th3r3_ar3_1ns3cure_RSA_m0duli_7hat_at_f1rst_gl4nce_appe4r_t0_be_s3cur3}

bbbbbbrsa

 

 

题目给出e的取值范围 ,以及n和p、base32加密并倒序的c
由n和p可得q,base32倒序解密得c
只要爆破出e即可

p = 177077389675257695042507998165006460849
n = 37421829509887796274897162249367329400988647145613325367337968063341372726061
q = n // p
phi = (p - 1) * (q - 1)
import gmpy2

li = []
for i in range(50000, 70000):
	e = i
	while True:
		if gmpy2.gcd(e, phi) == 1:
			break
		else:
			e -= 1
	li.append(e)
c = '==gMzYDNzIjMxUTNyIzNzIjMyYTM4MDM0gTMwEjNzgTM2UTN4cjNwIjN2QzM5ADMwIDNyMTO4UzM2cTM5kDN2MTOyUTO5YDM0czM3MjM'
c = c[::-1]  # 字符串求反
import base64

c = int(base64.b64decode(c))
from Crypto.Util import number

for e in li:
	d = gmpy2.invert(e, phi)
	try:
		print(number.long_to_bytes(gmpy2.powmod(c, d, n)).decode())
	except:
		continue

 flag{rs4_1s_s1mpl3!#}

 Keyboard

 

 看到之后发现这些字母都是在键盘的最上一行的字母,但是没有q,就9个字符,可以猜测是九宫格拼音。

o是在第九个,指在9这个数字对应的字母中,有3个表示是9上面的第3个字母

依次类推

一个一个对应即可得到答案

youaresosmartthatthisisjustapieceofcake

 这是什么?

打开题目之后发现是乱码,但是在里面有一些[])+!这些符号,是jsfuck加密,有两种解密的方法,一种是直接将加密的内容丢在控制台,回车就能达到flag

还有一种就是解密网站:http://codertab.com/JsUnFuck

 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值