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++和超进化

#include
int 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码
#include
int 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}

之后分析下爆破代码  


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部