2018-3-12
NCTF-base64全家桶
原题:
base64全家桶
150
全家桶全家桶全家桶!
我怎么饿了。。。。。。
密文(解密前删除回车):
R1pDVE1NWlhHUTNETU4yQ0dZWkRNTUpYR00zREtNWldHTTJES1JSV0dJM0RDTlpUR1kyVEdNWlRHSTJVTU5SUkdaQ1RNTkJWSVk
zREVOUlJHNFpUTU5KVEdFWlRNTjJF
分析:
base64,base32,base16解一遍就行。
>>> from base64 import *
>>>
>>> b64decode("R1pDVE1NWlhHUTNETU4yQ0dZWkRNTUpYR00zREtNWldHTTJES1JSV0dJM0RDTlpUR1kyVEdNWlRHSTJVTU5SUkdaQ1RNTkJWSVkzREVOUlJHNFpUTU5KVEdFWlRNTjJF==")
b'GZCTMMZXGQ3DMN2CGYZDMMJXGM3DKMZWGM2DKRRWGI3DCNZTGY2TGMZTGI2UMNRRGZCTMNBVIY3DENRRG4ZTMNJTGEZTMN2E'
>>> b32decode("GZCTMMZXGQ3DMN2CGYZDMMJXGM3DKMZWGM2DKRRWGI3DCNZTGY2TGMZTGI2UMNRRGZCTMNBVIY3DENRRG4ZTMNJTGEZTMN2E")
b'6E6374667B6261736536345F6261736533325F616E645F6261736531367D'
>>> b16decode("6E6374667B6261736536345F6261736533325F616E645F6261736531367D")
b'nctf{base64_base32_and_base16}'
>>>
flag:
nctf{base64_base32_and_base16}
知识点:
base编码
NCTF-n次base64
原题链接:
http://chinalover.sinaapp.com/decode1/base64.txt
分析:
应该是很多次的base64编码,用python脚本跑就行。
payload:
#python 3.x
from base64 import *
f = open("base64.txt")
try:
b = f.read()
finally:
f.close()
while True:
try:
b = b64decode(b)
except:
print(b)
break
flag:
nctf{please_use_python_to_decode_base64}
知识点:
base64,python
2018-3-13
NCTF-骚年来一发吗
原题链接:
http://ctf.nuptsast.com/challenges#%E9%AA%9A%E5%B9%B4%E6%9D%A5%E4%B8%80%E5%8F%91%E5%90%97
骚年来一发吗
250
密文:iEJqak3pjIaZ0NzLiITLwWTqzqGAtW2oyOTq1A3pzqas
分析:
题目给出了一个加密函数,我们只要按照加密的规则,逆过来,就可以将其解密了。
我们先分析一下加密函数:
<?php
function_encode($str){
$_o = strrev($str); // 将传进的字符串反转
for($_0 = 0; $_0 < strlen($_o); $_0++){
$_c = substr($_o, $_0, 1); // 循环遍历反转后的字符串的所有字符
$__ = ord($_c) + 1; // 将每个字符串的ASCII加1
$_c = chr($__); // 然后将新的字符串赋值给一个新的变量
$_ = $_.$_c; //将这些新的字符进连接
}
return str_rot13(strrev(base64_encode($_))); // 将得到的新字符串Base64加密后再反转然后再求Rot-13 , 最后返回
}
?>
那么解密函数的思路也很清楚了。
1. rot_13
2. strrev
3. base64decode
4. strrev
5. 遍历处理
payload:
#php解法
<?php
function decode($str)
{
$res='';
$one=str_rot13($str);
$two=strrev($one);
$three=base64_decode($two);
$four=strrev($three);
for($i=0;$i<strlen($four);$i++)
{
$a=substr($four,$i,1);
$b=ord($a)-1;
$c=chr($b);
$res=$res.$c;
}
return $res;
}
print decode("iEJqak3pjIaZ0NzLiITLwWTqzqGAtW2oyOTq1A3pzqas");
?>
#题外话:我特别讨厌类似$__,$_o,$0之类的变量命名法,写给最强大脑看吗?
flag:
nctf{rot13_and_base64_and_strrev}
知识点:
rot_13加密、base64、php代码审计、编程语言(其实php或者其他都行)
关于Rot-13 , 这种加密方式其实就是利用凯撒加密的原理 ,
但是为什么得到的密文加密一次后又会变成明文呢 ?
正好因为英文有26个字母 ,
位移13位之后刚好又可以回到原来的位置
2018-3-14
mixed_base64
原题链接:
mixed_base64
250
code.txt
多重base64加密,
干(sang)得(xin)漂(bing)亮(kuang)!
分析:
题目给出了生成的源码,base16,base32,base64 随机加密3次。
那么我也解密十次:
from base64 import *
f = open("code.txt")
try:
b = f.read()
finally:
f.close()
for i in range(10):
try:
b = b16decode(b)
except:
try:
b = b32decode(b)
except:
b = b64decode(b)
print(b)
payload:
以上
flag:
nctf{random_mixed_base64_encode}
知识点:
python编程、base加密
2018-3-15
NCTF-异性相吸
原题链接:
题目链接:
异性相吸
300
同性真爱,异性相吸都是假的!(题目要求,我是直的)
解密压缩文件里的内容
TIPS:
xor
hex2binary
len(bin(miwen))==len(bin(mingwen))
分析:
题目给了提示,xor,那么猜测就是将压缩包的内容,按照异或运算,即可。
01editor按照二进制打开;
分别得到其二进制代码,方便计算:
利用脚本,计算异或结果:
#python 3.x
a = '0000101000000011000101110000001001010110000000010001010100010001000010100001010000001110000010100001111000110000000011100000101000011110001100000000111000001010000111100011000000010100000011000001100100001101000111110001000000001110000001100000001100011000'
b = '0110110001101111011101100110010101101100011011110111011001100101011011000110111101110110011001010110110001101111011101100110010101101100011011110111011001100101011011000110111101110110011001010110110001101111011101100110010101101100011011110111011001100101'
for i in range(len(a)):
if(a[i] == b[i]):
print('0',end='')
else:
print('1',end='')
得到运算结果后,按照二进制复制到01editor中,然后得到flag。
flag:
nctf{xor_xor_xor_biubiubiu}
知识点:
异或运算
2018-3-16
NCTF-MD5
原题链接
MD5
300python大法好!
这里有一段丢失的md5密文
e9032???da???08????911513?0???a2
要求你还原出他并且加上nctf{}提交已知线索 明文为: TASC?O3RJMV?WDJKX?ZM
分析
这里很显然是md5碰撞,md5是指纹加密,不可逆,但是可以通过字符串碰撞出和密文一致的结果。题目缺失了三个字符,还有可能爆破,多了恐怕。。。。
payload
python脚本:
#python3.x
import hashlib
# 明文为: TASC_O3RJMV_WDJKX_ZM
# 密文为 : e9032___da___08____911513_0___a2
str1 = "TASC"
str2 = "O3RJMV"
str3 = "WDJKX"
str4 = "ZM"
#将字符存在列表中,方便调用
dic = ['!', '#', '$', '%', '&', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '?', '@',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'_', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
def getMD5(minwen):
md5obj = hashlib.md5()
md5obj.update(str.encode(minwen))
return md5obj.hexdigest()
for i in dic:
for j in dic:
for k in dic:
minwen = str1 + i + str2 + j + str3 + k + str4 #拼接明文字串
print(minwen,end=' ')
md5 = getMD5(minwen)
print(md5)
if md5.startswith("e9032") and md5.endswith("a2"):
print("find flag: nctf{"+md5+"}")
exit(0)
注意,这里有个坑,得到的明文不是题目要的答案,题目要求还原的是密文。
最后说一句:BF+python大法好!
flag:
nctf{e9032994dabac08080091151380478a2}
2018-3-17
NCTF-综合题
原题链接:
http://teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/index.php
分析:
很显然是jsfuck的编码,直接在控制台中运行一下,试试看,得到1bc29b36f623ba82aaf6724fd3b16718.php,
访问http://teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/1bc29b36f623ba82aaf6724fd3b16718.php,结果不对,还被嘲讽了。
哈哈哈哈哈哈你上当啦,这里什么都没有,TIP在我脑袋里
但是好像提示tip,回头看题,发现tip是bash。
响应头里也出现了history of bash。
度娘一下,Linux下查看命令行历史记录
简单的说,Linux的bash命令会存在.bash_history中,然后可以通过history(bash中),或者./history(vim,cat)查看。
于是访问
http://teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/.bash_history
,得到
zip -r flagbak.zip ./*
那么我们接着访问http://teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/flagbak.zip
即可下载压缩包,解压得到flag。
flag:
nctf{bash_history_means_what}
知识点:
bash_history
2018-3-18
SQL注入2
原题链接
http://ctf.nuptsast.com/challenges#SQL%E6%B3%A8%E5%85%A52
分析
源码:
<?php
if($_POST[user] && $_POST[pass]) {
mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
mysql_select_db(SAE_MYSQL_DB);
$user = $_POST[user];
$pass = md5($_POST[pass]);
$query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'"));
if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {
echo "<p>Logged in! Key: ntcf{**************} </p>";
}
else {
echo("<p>Log in failure!</p>");
}
}
?>
关键代码:
$query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'"));
if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {
echo "<p>Logged in! Key: ntcf{**************} </p>";
}
函数strcasecmp —
二进制安全比较字符串(不区分大小写)
提示说union select ,于是构造一个md5(1)的联合查询。
得到flag。
payload
user: -1’ union select md5(1)#
pw: 1
flag
ntcf{union_select_is_wtf}
2018.3.19
密码重置2
原题链接
http://nctf.nuptzj.cn/web14/index.php
TIPS:
1.管理员邮箱观察一下就可以找到
2.linux下一般使用vi编辑器,并且异常退出会留下备份文件
3.弱类型bypass
分析
查看网页源码,发现邮箱: admin@nuptzj.cn
tips2 关于vim的备份文件.swp格式文件,百度得到:https://blog.csdn.net/qingchenldl/article/details/79702355
于是查看文件http://nctf.nuptzj.cn/web14/.submit.php.swp
注意查看文件要加.
获得关键代码:
if(!empty($token)&&!empty($emailAddress)){
if(strlen($token)!=10) die('fail');
if($token!='0') die('fail');
$sql = "SELECT count(*) as num from `user` where token='$token' AND email='$emailAddress'";
$r = mysql_query($sql) or die('db error');
$r = mysql_fetch_assoc($r);
$r = $r['num'];
if($r>0){
echo $flag;
}else{
echo "失败了呀";
}
}
容易看到token要满足:
strlen(
token)=10
t
o
k
e
n
)
=
10
token = 0
容易想到 token=0e12345678(科学计数法绕过)
得到flag。
flag
nctf{thanks_to_cumt_bxs}
知识点
vim的.swp文件
php弱类型