前言
比赛好卷,题目好难,十道题目就出了四道,排名第二十一名,明年继续努力
一生壹世
压缩包注释提示得到解压密码是1314
解压之后得到四个txt文件
010打开分析发现文件头第一个字节拼接是个png的hex头
所以不难猜出是一个png图片,数据被拆分到这四个文件中了
然后发现四个txt文件都是1669字节
所以写个python脚本循环1669次依次读取文件字节并写入到同一个png文件进行整合即可,脚本如下
flag1=open('一.txt',"rb")
flag2=open('生.txt',"rb")
flag3=open('壹.txt',"rb")
flag4=open('世.txt',"rb")
true_flag=open("flag.png","wb")
data=[]
for a in range(1669):
i = flag1.read(1)
data.append(i)
i = flag2.read(1)
data.append(i)
i = flag3.read(1)
data.append(i)
i = flag4.read(1)
data.append(i)
for i in data:
true_flag.write(i)
print("success!!!")
得到flag
Flag{JPG}
Hashattack
扫目录发现存在git源码泄露
通过Githack下载源码
得到getflag.php的源码
<?php
error_reporting(0);
include "flag.php";
$user=$_POST['user'];
function encrypt($text){
global $key;
return md5($key.$text);
}
if (encrypt($user)===$_COOKIE['verify']) {
if(is_numeric(strpos($user,'root'))){
die($flag);
}
else{
die('not root!!!');
}
}
else{
setcookie("verify",encrypt("guest"),time()+60*60*24);
setcookie("len",strlen($key),time()+60*60*24);
}
//show_source(__FILE__);
分析源码可得是哈希长度扩展攻击,抓包从cookie可以得知len=32,并且user和verify可控
直接使用hashpump获得签名和root相关cookie等数据
\x->%然后替换cookie和user传参即可得到flag
flag{65089e251c4084e4ef5fad52221a3b0e}
Rand5
elf文件
分析源码
gtable是读出码表(可以动态调试出)
encode是base64加密(换码表了)
用gdb调试得出每次的v3
分别如下:
1.#nopqrstuvwxyz0123456789/+ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm
2.#GHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/+ABCDEF
3.#pqrstuvwxyz0123456789/+ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmno
4.#z0123456789/+ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy
5.#RSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789/+ABCDEFGHIJKLMNOPQ
倒着换码表base64解密
最后一次的脚本如下:
import base64
a=list("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")
b='nopqrstuvwxyz0123456789/+ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklm' #转换后的码表
c='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
s='ANYIAeTXAqvez9+c1qoI1t0L06DYAt7X19zY+d7cz6+g1tsJ+/b=' #加密后的
c=str.maketrans(b,c)
print(base64.b64decode(s.translate(c)))
s是加密后的内容
b是调试出来的码表
第一次的脚本中s为
cISes12ZhleYs3qDloWqbFZHknejdFi2hm1BelxFllKWnUhAiHFItF6rhkehs1WmbF6eiGaolnN8mGiCjUd8r1irknN8iEyUhl6ieVZDeH2VtmVDjUapt1q+dHFKsm20inGmcFWohoSYn1VEiG6ptFaXuHKed1GBkFq3rlCBint=
得出结果作为第二个s
flag{0d271f580a8cd571de09c1ce51698aba}
CBC
CBC字节反转攻击
分析源码发现需要求出base64_cipher,而username和password都是admin
已知key= abcdef0123456789,iv= 1234567891234567
直接构造exp如下
import base64
from Crypto.Util.Padding import pad
from Crypto.Cipher import AES
key=b"abcdef0123456789"
iv=b"1234567891234567"
user="username:admin;password:admin"
data = lambda s:s+(16 - len(s)%16) * chr(0)
success_data = data(user)
\#print(success_data)
base64_cipher = AES.new(key, AES.MODE_CBC, iv)
d =base64_cipher.encrypt(success_data.encode('utf8'))
print(base64.b64encode(d))
得到b’idVegWpPAM8A414waIjDKaG7eLLrT4vtnR1WIO9x6do=’
Get传参
?username=admin&password=admin&base64_cipher=idVegWpPAM8A414waIjDKaG7eLLrT4vtnR1WIO9x6do=
得到flag
flag{e8fdddd52655347073194f347e05e5cd}