第一次写WriteUp,好兴奋。
大一新生,萌新一枚,求关照...
第一题:
这个题,一看字母数字base64跑起,百度或者python一跑,出结果。
Flag:nctf{this_is_base64_encode}
10分到手
base64,base32,base16的区别如下
base64:包含大写字母(A-Z),小写字母(a-z),数字(0-9)以及+和/
base32:大写字母(A-Z)和数字234567
base16:数字(0-9),字母(ABCDEF)
当ASCll用Base加密达不到所对应的位数的时候用=号补齐。
所以看到字母数字都有,就确定是base编码;有小写字母,base64,有只大写字母,base32,大写字母A-F和数字,base16。
嗯,记住了。
第二题:
这题,看键盘。
脑洞很重要!!!!看手指的轨迹!!!
百度找个键盘布局画图画一下,然后:
Flag:nctf{areuhack}
20分到手。
脑洞很重要,嗯,记住了。
第三题:
看提示:
1.xor 异或
2.hex2binary 十六进制转二进制
3.len(bin(miwen))==len(bin(mingwen)) 密文的二进制长度和明文的二进制长度相等
第一步,异或。
直接C++或者Python,我选择C++。
看一下文件大小,
32个字节,对应32个字符,char类型,嗯,应该没错。
#include
using std::ios;
using std::ifstream;
int main() {
ifstream fr;
char mingwen[33] = {}, miwen[33] = {};
fr.open("明文.txt", ios::binary);
fr.read(mingwen, 32);
fr.close();
fr.open("密文.txt", ios::binary);
fr.read(miwen, 32);
fr.close();
printf("明文为:%s\n", mingwen);
printf("密文为:%s\n", miwen);
printf("异或开始\n");
int i;
char cxor[33] = {};
for (i = 0; i < 32; i++)
cxor[i] = mingwen[i] ^ miwen[i];
printf("异或完成\n");
printf("异或之后的结果为:%s", cxor);
return 0;
}
Flag:nctf{xor_xor_xor_biubiubiu}
30分到手,开心!
后面有一个假的第四题:
Flag:nctf{zhaowomen}
一分到手,不说话了…
第四题:
Wiener是啥?
百度搜半天找不到有关的,那就谷歌吧。
好像看到了什么不得了的东西…
下载下来看看…
看下Readme
嗯,就知道是个RSA加密,看了还是不会用…
那就直接看主程序吧…
这主程序看着像python3的,看print函数就能看出来
看见用法了。
已知e,n,出来d,大概…懂了?
看一下下载下来的那个py。
逆着走一遍算法,构造一个密钥,然后加密,大概就这样。
RSA中,e,n组成公钥,e,d组成私钥,然后
这两个长整数中有一个是d,有一个是n,于是…
改一下主程序的那个py
试试…
于是挂了…
那就交换一下n,e再来一次…
得到d
查一下RSA.construct在python中的用法
https://www.dlitz.net/software/pycrypto/api/2.6/
文档如上
挑重点!!!construct私钥要n,e,d
所以,改一下CTF下载下来的那个py,那个脚本看着像py2写的
#coding:utf-8
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
import base64
cipher_text = 'AGgt1h6dudnkeoCr7SFclkYYsYa65KZ8V29bbgbf+BDyjnyx5stCYjcyktat73aHs2EOaMgwGUwj3HwPTvT+T5LHIxM4uTnAgWOui4dnb7vF7QizN0ShY2O1h26CgLnf5I0vQWbY7WCC7kA/orNW7F5yxZiKRAawacS2M5ghP4/Q'
key=RSA.construct((1063045321283844468344531168992778520651192162100948533991539097447031440090068191835838938460807260866872379834796862916118785271062209281267667069640000501698142693389209275376843382863579650119977059768375028586326490055087394631528241983631462471709913758728591459476799115050977493979613545056736162868049L, 837165022918376318972691589160491375229372195625940137121740685432530132860541010174727630660292946071507342455170833392895060048564125597915757582027572284342507277083636059558106672685400173531425920294781499112027917632497954958437660357575400222692979844873372105801998210845285775146263117399191185379347L,57899763801722261062891290503559835904571946557258761154422546104824094670843L))
cipher = Cipher_pkcs1_v1_5.new(key)
cipher_text = cipher.decrypt(base64.b64decode(cipher_text))
print cipher_text
改成这样大概,然后跑一下,崩了
decrypt()需要3个参数只提供了两个,于是百度…
来源:https://www.jb51.net/article/86022.htm
后面那个参数加上
需要from Crypto import Random
加上后再跑一下…
Flag:flag{nell_anima_ritrovo_la_speranza_che_nel_corpo_stanco_ormai}
65分到手,兴奋。
第五题:
给了e,n,m(明文),求密文
于是先拿上面的那个wiener跑一下,然后崩了
然后开始RSA的日常,上factordb
http://factordb.com/
这是个分解n的网站,然后就知道p,q了,然后再按照RSA的算法写个脚本跑一下,大概就这样…
先跑一下n的10进制
复制粘贴到factordb
跑出来了
按照RSA的算法,p= 1578173871764844869716052171,q= 10710927547195113973175047066215146269
然后就要求d了,已知p,q,e,求d,找个现成的脚本跑一下就行,我找的这个:
https://blog.csdn.net/zyxyzz/article/details/78205321
感谢楼上师傅提供的脚本
跑一下出来d了
然后再拿上面的那个脚本跑一下就出来明文了
from Crypto import Random
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5
text = 0x237200C0F72B97DB55BA37C7AACBB61A26A0CB47D294726259C4DF
key = RSA.construct((16903705997349646195704375376941855414691523387719679999999999999L, 65537L,71961395444719033349123712211093410967715759287662860214461993L))
cipher = Cipher_pkcs1_v1_5.new(key)
text = cipher.encrypt(str(text))
print text
然后崩了…
百度一下,发现了
来自:https://blog.csdn.net/orangleliu/article/details/72964948
那就分开加密试试
先得到这个数字
然后分块,每次1个数字不算很长吧…
于是还是一样的崩,我也不知道为啥,也不想看库的文档了…
算了不用这个加密器了…
那就自力更生,丰衣足食
RSA的加密的算法不难,python大数运算没有位数限制,于是搜一下python的运算符
看到了重点
于是写了个脚本:
N=16903705997349646195704375376941855414691523387719679999999999999
e=65537
d=71961395444719033349123712211093410967715759287662860214461993
m=0x237200C0F72B97DB55BA37C7AACBB61A26A0CB47D294726259C4DF
print ((m**d)%N)
跑了一个小时还没出,笔记本都热了…
好像有哪里不对劲…
算了还是百度吧…
https://www.freebuf.com/articles/others-articles/166049.html
这个上面找了个脚本跑了一下,一秒出结果…
感谢楼上师傅提供的脚本
import math
N=16903705997349646195704375376941855414691523387719679999999999999
e=65537
d=71961395444719033349123712211093410967715759287662860214461993
m=0x237200C0F72B97DB55BA37C7AACBB61A26A0CB47D294726259C4DF
print (hex(pow(m,d,N))[2:-1].decode('hex'))
Flag:flag{Acdxvf5vD_15_W7f}
30分到手。
不说话了,还是自己太菜…
学习中...