2023铁三第一赛区分区赛 | 风尘孤狼
0%

2023铁三第一赛区分区赛

image-20230110233516764

前言

比赛好卷,题目好难,十道题目就出了四道,排名第二十一名,明年继续努力

一生壹世

压缩包注释提示得到解压密码是1314

img

解压之后得到四个txt文件

010打开分析发现文件头第一个字节拼接是个png的hex头

img

img

img

img

所以不难猜出是一个png图片,数据被拆分到这四个文件中了

然后发现四个txt文件都是1669字节

img

所以写个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

img

Flag{JPG}

Hashattack

扫目录发现存在git源码泄露

img

通过Githack下载源码

img

得到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可控

img

直接使用hashpump获得签名和root相关cookie等数据

img

\x->%然后替换cookie和user传参即可得到flag

img

flag{65089e251c4084e4ef5fad52221a3b0e}

Rand5

elf文件

img

分析源码

gtable是读出码表(可以动态调试出)

encode是base64加密(换码表了)

用gdb调试得出每次的v3

img

分别如下:

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

img

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

img

flag{e8fdddd52655347073194f347e05e5cd}

制作不易,如若感觉写的不错,欢迎打赏