Buuctf-02攻防世界-01
目录
Buu
Crypto
[MRCTF2020]古典密码知多少
[WUSTCTF2020]佛说:只能四天
攻防世界
Web
robots
backup
xff_referer
command_execution
simple_js
base64stego
功夫再高也怕菜刀
SimpleRAR
Reverse
Hello-CTF
python-trade
open-source
simple-unpack
crypto
幂数加密
easychallenge
Normal_RSA
easy_ECC ※
cr3-what-is-this-encryption
告诉你个秘密
banana-princess
Decrypt-the-Message
streamgame2 ※
Buu
Crypto
[MRCTF2020]古典密码知多少

猪圈密码+标准银河字母+圣堂武士+栅栏



得到FGCPFLIRTUASYON,栅栏解密:FLAGISCRYPTOFUN
flag{CRYPTOFUN}
[WUSTCTF2020]佛说:只能四天
参考链接
新约佛论禅,社会主义核心价值观编码,去掉_doyouknowfence栅栏密码解密,去掉_doyouknowCaesar凯撒密码解密,位移3位(只有大写字母和2~7的数字),Base32解码,换成flag{}的格式
flag{ni_hao_xiang_xiang_da_wo}
攻防世界
Web
robots
题目描述:X老师上课讲了Robots协议,小宁同学却上课打了瞌睡,赶紧来教教小宁Robots协议是什么吧。
/robots.txt
cyberpeace{1b09f73c62b6bd0ba72adbf4118410bc}
backup
如果网站存在备份文件,常见的备份文件后缀名有:“.git” 、“.svn”、“ .swp”“.~”、“.bak”、“.bash_history”、“.bkf” 。
.bak
Cyberpeace{855A1C4B3401294CB6604CCC98BDE334}
xff_referer
X-Forwarded-For
是一个 HTTP 扩展头部,主要是为了让 Web 服务器获取访问用户的真实 IP 地址。在代理转发及反向代理中经常使用X-Forwarded-For 字段。
是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。简单地说,xff是告诉服务器当前请求者的最终ip的http请求头字段,通常可以直接通过修改http头中的X-Forwarded-For字段来仿造请求的最终ip
xff,然后修改referer
command_execution
参考
目标:
掌握有关命令执行的知识
windows或linux下:command1 & command2 :不管command1执行成功与否,都会执行command2(将上一个命令的输出作为下一个命令的输入),也就是command1和command2都执行
command1 && command2 :先执行command1执行成功后才会执行command2,若command1执行失败,则不执行command2
command1 | command2 :只执行command2
command1 || command2 :command1执行失败,再执行command2(若command1执行成功,就不再执行command2)
先ping本地地址127.0.0.1,得知它是ping目标ip3次
使用命令连接符,知道flag在flag.txt中,查找该文件
127.0.0.1 & find / -name flag.txt
在/home/目录下,使用cat
127.0.0.1 & cat /home/flag.txt
cyberpeace{b4c8e98280e57b0b39343b02a1ee79dd}
simple_js
网页源代码:
JS
参考
(1)split() 方法用于把一个字符串分割成字符串数组
语法:string.split(separator,limit)
参数 描述
separator 可选。字符串或正则表达式,从该参数指定的地方分割 string Object。比如此题以逗号分割成字符串数组
limit 可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。
举例:str="a,b,c,d,e,f,g";
var 1st = str.split(",",3); 对str以逗号进行分割,分割后的字符串数组内的值最多只能有3个,结果就是1st = [a,b,c](2)for 循环的语法如下:
for (语句 1; 语句 2; 语句 3) {
要执行的代码块
}
语句 1 在循环(代码块)开始之前执行。
语句 2 定义运行循环(代码块)的条件。
语句 3 会在循环(代码块)每次被执行后执行。(3)fromCharCode() 可接受一个指定的 Unicode 值,然后返回一个字符串。
语法:String.fromCharCode(n1, n2, ..., nX)
参数 描述
n1, n2, ..., nX 必需。一个或多个 Unicode 值,即要创建的字符串中的字符的 Unicode 编码。(4)prompt()方法用于显示可提示用户进行输入的对话框。
这个方法返回用户输入的字符串
语法:prompt(msg,defaultText)
参数 描述
msg 可选。要在对话框中显示的纯文本(而不是 HTML 格式的文本)就是弹框显示文本。
defaultText 可选。默认的输入文本,你输入什么弹框一开始出现里面的输入框就会默认显示你这个文本。(5)var i,j,k,l=0,m,n,o,p = "";
这个表示声明变量i,j,k,l,m,n,o,p,只有l和p两个变量被赋值了,其它的变量都是不带值的,不带有值的变量,它的值将是undefined,后续代码中可以给它赋值。(6)length
length 属性可设置或返回数组中元素的数目。
执行流程:
一、首先定义了一个dechiffre函数,咱先不管,因为还没有调用
先将\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30十六进制数转换成字符串,python下print或网址转换,
输出结果55,56,54,79,115,69,114,116,107,49,50二、执行String["fromCharCode"](dechiffre("55,56,54,79,115,69,114,116,107,49,50
"));三、调用执行dechiffre函数
String["fromCharCode"](dechiffre("55,56,54,79,115,69,114,116,107,49,50"));
(1)先将"55,56,54,79,115,69,114,116,107,49,50"带入dechiffre函数执行,即dechiffre(pass_enc)=dechiffre("55,56,54,79,115,69,114,116,107,49,50")(2)看到了pass变量
(3)因为pass_enc="55,56,54,79,115,69,114,116,107,49,50"
将pass_enc字符串分割成字符串数组,赋值给tab参数,所以:
tab=[55,56,54,79,115,69,114,116,107,49,50] 注:tab此时是字符串数组!!!(3)对pass分割
tab2=[70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65](4)变量赋值代码分析:var i,j,k,l=0,m,n,o,p = "";i = 0;j = tab.length;
一开始i,j,k,m,n,o,没有赋值,undefined,其它参数l=0,p="",后来i被赋值=0,j被赋值为11(5)第九行此时n被赋值为0,所以k=11+0+0,最后等于11
(6)第十行中,n=18
(7)第一个for循环,精简一下代码:
for(i = 0; i < (18); i++ )
{o = tab[i-l];p += String.fromCharCode((o = tab2[i]));
if(i == 5)break;}
解释:前面的o=tab[i-1]是无用的,因为后面会被o=tab2[i]的值重新覆盖
第一次循环:o=tab[0];p=p+String.fromCharCode((o = tab2[0])=>o=70;p=""+String.fromCharCode(70)=>p=英文字母F
第二次...
第三次...
第四次...
第五次...
所以,这个for循环,最后的p为(尽管没有输出出来,这里我们知道就好)FAUX P(8)第二个for循环,精简一下代码:
for(i = 0; i < 18; i++ ){
o = tab[i-l];
if(i > 5 && i < 17)
p += String.fromCharCode((o = tab2[i]));
}
解释:这里的for循环和上面的差不多,注意这里的p值由于第一次for循环执行后现在已经是FAUX P了
加上第一次for循环的p值,最后的p为FAUX PASSWORD HAH(9)p += String.fromCharCode(tab2[17]);
因为tab2=[70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65]
所以:p=FAUX PASSWORD HAH + A
因此,最后的p为FAUX PASSWORD HAHA(10)pass = p;return pass;
即 pass = FAUX PASSWORD HAHA;return FAUX PASSWORD HAHA;
最后函数输出为FAUX PASSWORD HAHA输出值虽然用到了带进来的参数(就是分割后的tab数组),但是for循环直接使用tab2数组相关代码的值,根本没有用到tab数组的值,所以由于代码逻辑问题,传入的dechiffre的参数pass_enc是没有任何意义的
三、dechiffre函数执行完成后,继续执行其它的代码
h = window.prompt('Enter password');
alert( dechiffre(h) );
h=你输入弹框内的内容
之后alert弹出dechiffre(h)的值,由前面所有的代码可知,代码里p的值与tab无关,最终都会被tab2的值替代,所以无论输入什么,即pass_enc=h无论输入的h是什么,不管tab能否被分割成字符串数组,是否存在,都只会利用到tab2,pass_enc参数是什么也就没有意义。四、结论:无论我们在弹框中输入什么值,都只返回FAUX PASSWORD HAHA。
猜想:String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));这个语法错误,并且没有没计算出来的是flag。
重新写代码执行:
我很长一段的c++
和超进化:#includeint main(){int a[11]={55,56,54,79,115,69,114,116,107,49,50};char c[11];for(int i=0;i<11;i++){c[i]=(char)a[i];printf("%c",c[i]);}return 0; } //节操兽超进化!无节操兽! //可以直接给char类型赋值ascii码 #includeint main(){char a[11]={55,56,54,79,115,69,114,116,107,49,50};for(int i=0;i<11;i++)printf("%c",a[i]);return 0; } php↑
OUTPUT:
786OsErtk12
base64stego
参考,参考
import re
import base64b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'# s.txt为待解密的base64隐写字符串所在的文件
f = open('s.txt','r')
base64str = f.readline()# pattern2用于匹配两个等号情况时,等号前的一个字符
# pattern2用于匹配一个等号情况时,等号前的一个字符
pattern2 = r'(\S)==$'
pattern1 = r'(\S)=$'# 提取后的隐写二进制字符加入binstring中
binstring = ''# 逐行读取待解密的base64隐写字符串,逐行处理
while(base64str):# 先匹配两个等号的情况,如果匹配不上,再配置一个等号的情况# 如果无等号,则没有隐藏,无需处理if re.compile(pattern2).findall(base64str):# mstr为等号前的一个字符,该字符为隐写二进制信息所在的字符mstr = re.compile(pattern2).findall(base64str)[0]# 确认mstr字符对应的base64二进制数,赋值给mbinmbin = bin(b64chars.find(mstr))# mbin格式如0b100,mbin[0:2]为0b# mbin[2:].zfill(6)为将0b后面的二进制数前面补0,使0b后面的长度为6mbin2 = mbin[0:2] + mbin[2:].zfill(6)# 两个等号情况隐写了4位二进制数,所以提取mbin2的后4bit# 赋值给stegobin,这就是隐藏的二进制信息stegobin = mbin2[-4:]binstring += stegobinelif re.compile(pattern1).findall(base64str):mstr = re.compile(pattern1).findall(base64str)[0]mbin = bin(b64chars.find(mstr))mbin2 = mbin[0:2] + mbin[2:].zfill(6)# 一个等号情况隐写了2位二进制数,所以提取mbin2的后2bitstegobin = mbin2[-2:]binstring += stegobinbase64str = f.readline()# stegobin将各行隐藏的二进制字符拼接在一起
# 从第0位开始,8bit、8bit处理,所以range的步进为8
for i in range(0,len(binstring),8):# int(xxx,2),将二进制字符串转换为10进制的整数,再用chr()转为字符print(chr(int(binstring[i:i+8],2)),end='')
print()
flag{Base_sixty_four_point_five}
功夫再高也怕菜刀
参考
foremost或者binwalk + wireshark + 010editor
右键第1150个数据包,追踪TCP流,复制从FFD8开始到FFD9的内容,到010里新建文件粘贴,得到.jpg,是压缩包的密码。
flag{3OpWdJ-JP6FzK-koCMAK-VkfWBq-75Un2z}
SimpleRAR
010editor + photoshop + StegSolve
flag{yanji4n_bu_we1shi}
Reverse
Hello-CTF
CrackMeJustForFun
特点是不用包flag……第一次见。
ida F5反编译,十六进制转字符,over。
view-Open subviews-Generate pesudocode (快捷键F5)
python-trade
pyc转py。
uncompyle6 -o 1.py 1.pyc
源码
def encode(message):s = ''for i in message:x = ord(i) ^ 32x = x + 16s += chr(x)return base64.b64encode(s)correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
flag = ''
print 'Input flag:'
flag = raw_input()
if encode(flag) == correct:print 'correct'
else:print 'wrong'
sol.py
cr是base64.b64decode(ss)
import base64
ss= 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
cr=base64.b64decode(ss)
s=''
for i in cr:i-=16i^=32s+=chr(i)
print(s)
nctf{d3c0mpil1n9_PyC}
open-source
搜索得到
描述
C 库函数 int atoi(const char *str) 把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。
声明
下面是 atoi() 函数的声明。
int atoi(const char *str)参数
- str -- 要转换为整数的字符串。
返回值
该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。
实例
下面的实例演示了 atoi() 函数的用法。
#include#include #include int main() {int val;char str[20];strcpy(str, "98993489");val = atoi(str);printf("字符串值 = %s, 整型值 = %d\n", str, val);strcpy(str, "runoob.com");val = atoi(str);printf("字符串值 = %s, 整型值 = %d\n", str, val);return(0); } 让我们编译并运行上面的程序,这将产生以下结果:
字符串值 = 98993489, 整型值 = 98993489 字符串值 = runoob.com, 整型值 = 0
根据给的.c文件直接修改,得到key
#include
#include int main() {//unsigned int hash = first * 31337 + (second % 17) * 11 + strlen(argv[3]) - 1615810207;// 51966*31337=1628458542 second%17=8 8*11=88 7 =12648430 unsigned int hash = 12648430 ;printf("Get your key: ");printf("%x\n", hash);return 0;
}
c0ffee
simple-unpack
题目描述:菜鸡拿到了一个被加壳的二进制文件
虽然但是,直接用010打开搜flag(ascii)就得到flag
flag{Upx_1s_n0t_a_d3liv3r_c0mp4ny}
ida打开,或者upx脱壳之后ida打开
crypto
幂数加密
8842101220480224404014224202480122
解析:
原以为是二进制幂数加密法,但是比照之后发现不太对,没有字母转换后出现8这个数字。后面发现是**01248密码(云影密码)**,使用 0,1,2,4,8 四个数字,其中 0 用来表示间隔,其他数字以加法可以表示出 如:28=10,124=7,18=9,再用 1->26 表示 A->Z。
88421 122 48 2244 4 142242 248 122
23 5 12 12 4 15 14 5
W E L L D O N E
cyberpeace{WELLDONE}
easychallenge
import base64def decode1(ans):s = ''for i in ans:x = ord(i) - 25x = x ^ 36s += chr(x)return sdef decode2(ans):s = ''for i in ans:x = i^ 36x = x - 36s += chr(x)return sdef decode3(ans):return base64.b32decode(ans)final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='
flag=decode1(decode2(decode3(final)))
print(flag)
cyberpeace{interestinghhhhh}
Normal_RSA
flag.enc和pubkey.pem(公钥)
参考
↑ 需要kali,需要kali,需要kali
windows环境参考
PCTF{256b_i5_m3dium}
easy_ECC
工具
原理待学。
berpeacecy{19477226185390}
cr3-what-is-this-encryption
import gmpy2
from Crypto.Util import number
from Crypto.Util.number import long_to_bytesp=0xa6055ec186de51800ddd6fcbf0192384ff42d707a55f57af4fcfb0d1dc7bd97055e8275cd4b78ec63c5d592f567c66393a061324aa2e6a8d8fc2a910cbee1ed9
q=0xfa0f9463ea0a93b929c099320d31c277e0b0dbc65b189ed76124f5a1218f5d91fd0102a4c8de11f28be5e4d0ae91ab319f4537e97ed74bc663e972a4a9119307
e=0x6d1fdab4ce3217b3fc32c9ed480a31d067fd57d93a9ab52b472dc393ab7852fbcb11abbebfd6aaae8032db1316dc22d3f7c3d631e24df13ef23d3b381a1c3e04abcc745d402ee3a031ac2718fae63b240837b4f657f29ca4702da9af22a3a019d68904a969ddb01bcf941df70af042f4fae5cbeb9c2151b324f387e525094c41
c=0x7fe1a4f743675d1987d25d38111fae0f78bbea6852cba5beda47db76d119a3efe24cb04b9449f53becd43b0b46e269826a983f832abb53b7a7e24a43ad15378344ed5c20f51e268186d24c76050c1e73647523bd5f91d9b6ad3e86bbf9126588b1dee21e6997372e36c3e74284734748891829665086e0dc523ed23c386bb520d = gmpy2.invert(e,(p-1)*(q-1))m=pow(c,d,p*q)string = long_to_bytes(m) # m明文
print(string)
ALEXCTF{RS4_I5_E55ENT1AL_T0_D0_BY_H4ND}
告诉你个秘密
636A56355279427363446C4A49454A7154534230526D684356445A31614342354E326C4B4946467A5769426961453067
16进制转换,16进制转换文本字符串,在线16进制转换 | 在线工具
cjV5RyBscDlJIEJqTSB0RmhCVDZ1aCB5N2lKIFFzWiBiaE0g
Base64编码、解码 - 站长工具
r5yG lp9I BjM tFhBT6uh y7iJ QsZ bhM
据说要看键盘:
t o n g y u a n
……需要大写:TONGYUAN
banana-princess
Rot-13加密
cat 1.pdf | tr 'A-Za-z' 'N-ZA-Mn-za-m' > new.pdf
BITSCTF{save_the_kid}
Decrypt-the-Message
参考
Poem Codes
加密过程如下:
(1)就其算法而言,去诗歌头一个单词,全部罗列出来,然后所有单词的字母按字母表排序并编码,如第一个a为1,第二个a为2,如果没有a了就看b,第一个b为3,第二个b为4,一直排列下去。。。
(2)将要加密的信息的字母每18个一行(不足一行的abcdef....补足)
(3)将加密的信息第一个字母对应第一步的编码数字,到第二步生成的字母表中取某列。
(4)分组即成加密信息。
解密工具
具体用法如下(请注意只支持python2):
python poemcode.py examples/2/ctfpoem examples/2/ctfcip
猜解消息中选择最像的那条即可:
ifyouthinkcryptographyistheanswertoyourproblemthenyoudonotknowwhatyourproblemisabcdefghijklmnopqrstu
streamgame2
wp1是爆破
streamgame合集,还是爆破
flag{1110101100001101011}
之后分析下爆破代码
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
