Jak na webu co nejšíleněji zadávat datum? Jak to uživatelům co nejvíce znepříjemnit? V Bad UX World Cup 2025 (YouTube) se vybíraly ty nejšílenější UX návrhy. Vítězným návrhem se stal Perfect Date.
Společnost Collabora vydala (YouTube) na LibreOffice založený desktopový kancelářský balík Collabora Office. Pro Windows, macOS a Linux. Se stejným uživatelským rozhraním jako Collabora Online. Svůj desktopový kancelářský balík s rozhraním LibreOffice pojmenovala Collabora Office Classic.
Glen MacArthur vydal AV Linux (AVL) a MX Moksha (MXM) 25. S linuxovým jádrem Liquorix. AV Linux (Wikipedie) je linuxová distribuce optimalizována pro tvůrce audio a video obsahu. Nejnovější AV Linux vychází z MX Linuxu 25 a Debianu 13 Trixie. AV Linux přichází s desktopovým prostředím Enlightenment 0.27.1 a MX Moksha s prostředím Moksha 0.4.1 (fork Enlightenmentu).
Ubuntu pro testování nových verzí vydává měsíční snapshoty. Dnes vyšel 1. snapshot Ubuntu 26.04 LTS (Resolute Raccoon).
Zástupci členských států EU se včera shodli na návrhu, který má bojovat proti šíření materiálů na internetu zobrazujících sexuální zneužívání dětí. Nařízení známé pod zkratkou CSAM a přezdívané chat control mělo množství kritiků a dlouho nebyla pro jeho schválení dostatečná podpora. Pro schválení byla potřeba kvalifikovaná většina a dánské předsednictví v Radě EU se snažilo dosáhnout kompromisu. Návrh nakonec po dlouhých týdnech
… více »Britské herní studio Facepunch stojící za počítačovými hrami Garry's Mod a Rust uvolnilo svůj herní engine s&box (Wikipedie) jako open source. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT. Herní engine s&box je postavený nad proprietárním herním enginem Source 2 od společnosti Valve.
Vývoj programovacího jazyka Zig byl přesunut z GitHubu na Codeberg. Sponzoring na Every.
Stejně jako GNOME i KDE Plasma končí s X11. KDE Plasma 6.8 poběží už pouze nad Waylandem. Aplikace pro X11 budou využívat XWayland.
Poslanci Evropského parlamentu dnes vyzvali k výraznému zvýšení ochrany nezletilých na internetu, včetně zákazu vstupu na sociální sítě pro osoby mladší 16 let. Legislativně nezávazná zpráva, kterou dnes odsouhlasil Evropský parlament poměrem 493 hlasů pro ku 92 proti, kromě zavedení věkové hranice 16 let pro využívání sociálních sítí, platforem pro sdílení videí či společníků s umělou inteligencí (AI) vyzývá také k zákazu … více »
Doom v KiCadu nebo na osciloskopu? Žádný problém: KiDoom: Running DOOM on PCB Traces a ScopeDoom: DOOM on an Oscilloscope via Sound Card.
message.bin.gz, po dekompresi s obsahem
1000110 1001100 1000001 1000111 1111011 1110010 1111010 1110111 1100001 101101 1110000 110010 1010000 1111001 101101 111001 110110 1010010 1111001 101101 1000110 1100100 1011010 1010101 1111101(mimochodem téměř všechny úlohy byly komprimované gzipem a ukázalo se, že je bezpečné je dekomprimovat -- nešlo tedy o situaci kdy by byl flag nějak schovaný v komprimovaném streamu, například v úmyslných neoptimalitách komprese) Jedná se o ASCII kde jsou vypuštěny úvodní nuly (většinou jedna, ale u znaků s kódem pod 64 dvě), stačí doplnit, převést na binárku a přečíst. Mně štvalo jak tohle není v shellu přímočaré, tak jsem si kdysi napsal blobutils (naprogramováno příšerně když jsem to ještě neuměl), co používají ostatní nevím.
$ zcat message.bin.gz | tr " " "\n"|sed -re "s/^/0/g"
*ručně edituje výstup*
$ cat a | blbithex | blhexbin
FLAG{rzwa-p2Py-96Ry-FdZU}
106 114 101 107 173 172 125 113 171 55 65 161 156 112 55 160 67 114 104 55 63 146 151 164 175Jsou to bajty v osmičkové soustavě. Po chvíli zápasu s tím jak v
bc funguje ibase a obase:
$ for x in $(for b in `zcat octopus.gz`; do echo "obase=10;ibase=8;$b" | bc; done ); do dechex $x; done|blhexbin
FLAG{zUKy-5qnJ-p7LD-3fit}
46 4c 41 47 7b 38 4d 56 58 2d 4c 68 38 6d 2d 74 4d 4d 49 2d 4b 38 73 69 7dTohle je přímo hexdump, stačí přečíst.
$ zcat foxtrot.gz | blhexbin
FLAG{8MVX-Lh8m-tMMI-K8si}
RkxBR3tTNXJyLXJDeHQtYW1ZWS03WDQ2fQ==Toto je base64, stačí dekódovat.
$ zcat textual.b64.gz |base64 -d
FLAG{S5rr-rCxt-amYY-7X46}
Challenge task : Prove you are a ROBOT by evaluating the acceptability of following items: [electric engine, drone swarm, sweet baby, love, mineral oil, lovely puppy, pretty children, hope]Podle instrukcí je potřeba poslat zpátky v GET parametru seznam 0 a 1 podle toho jestli věci v seznamu jsou nebo nejsou vhodné pro roboty. Těch itemů je celkem 16, proto uděláme několik requestů a všechny si je vypíšeme.
Challenge timeout (sec) : 2
$ for i in `seq -w 1 10`; do wget http://challenges.thecatch.cz/c2619b989b7ae5eaf6df8047e6893405/ -O samples$i.txt; done $ cat samples*|grep -oE "\[.+]" | tr -d "]" | tr "," "\n"|tr "[" " " | sed -re "s/^ //g" | sed -re "s/ $//g" | sort | uniq artificial intelligence automatic transmission cute kitty drone swarm electric engine fast CPU fear hope large hard drive love lovely puppy mineral oil pretty children resistor 10 Ohm sweet baby yumy foodNásledně jsem je ručně roztřídil do souborů
acc a unacc. Řešit to budeme kompletně v shellu protože proč ne.
rm jar.txt
wget --keep-session-cookies --save-cookies jar.txt -S http://challenges.thecatch.cz/c2619b989b7ae5eaf6df8047e6893405/ -O challenge.txt
s=`grep -oE "\[.+]" challenge.txt | tr -d "]" | tr "," "\n"|tr "[" " " | sed -re "s/^ //g" | sed -re "s/ $//g"`
>str
echo "$s" | while read line; do
if grep -q "$line" acc; then
echo -n 1 >> str
elif grep -q "$line" unacc; then
echo -n 0 >> str
else
echo "unk w $line"
echo -n 0 >> str
fi
done
wget --load-cookies jar.txt -S http://challenges.thecatch.cz/c2619b989b7ae5eaf6df8047e6893405/?answer=`cat str` -O outf.txt
$ cat outf.txt
FLAG{4FZC-Noax-arko-r0z5}
Challenge task : Return value of variable 'j' in equation (5j + 9k - 4g)/3 + 4j - 2k + 7g + (6j + 1k - 6g)/5 + (9j - 10k + 4g)/2 + (6j + 9k + 3g)/11 = 1089095, where k = 61640, g = 56913Naprasíme v sympy. Je potřeba nahradit implicitní násobení hvězdičkami (
Challenge timeout (sec) : 2
6j → 6*j) a známé proměnné zadanými hodnotami (k → 61640). Následně se aplikuje toto řešení ze stackoverflow a výsledek se odešle.
#!/usr/bin/env python3
from sympy.solvers import solve
from sympy import Symbol
from sympy.core.sympify import sympify
import os
os.system("wget --keep-session-cookies --save-cookies jar.txt -S http://challenges.thecatch.cz/70af21e71285ab0bc894ef84b6692ae1/ -O challenge.txt")
l = open("challenge.txt").readlines()[0].strip()
pcs = l.split("'")
tgtvar = pcs[1]
pcs = l.split(" ")
rest = pcs[10:]
eq = ""
i=0
while rest[i] != "where":
eq += rest[i]
i+=1
setv1 = rest[i+1]
arg1 = rest[i+3][:-1]
eq = eq.replace(setv1, "*"+arg1)
setv2 = rest[i+4]
arg2 = rest[i+6]
eq = eq.replace(setv2, "*"+arg2)[:-1]
eq = eq.replace(tgtvar, "*x")
print(eq)
sympy_eq = sympify("Eq(" + eq.replace("=", ",") + ")")
s = solve(sympy_eq)
print(s)
os.system("wget --load-cookies jar.txt -S http://challenges.thecatch.cz/70af21e71285ab0bc894ef84b6692ae1/?answer=%s"%s[0])
$ ./solve.py
(5*x+9*61640-4*56913)/3+4*x-2*61640+7*56913+(6*x+1*61640-6*56913)/5+(9*x-10*61640+4*56913)/2+(6*x+9*61640+3*56913)/11=1089095
[74658]
$ cat index.html\?answer\=74658
FLAG{jyST-xaHl-un3Z-EG3X}
50.0927061N, 14.3605981E 50.0997428N, 14.3746981E 50.0948308N, 14.3574061E 50.0945831N, 14.3564781E 50.0383203N, 14.6338128E 49.8498033N, 18.1607744E 50.0996294N, 14.3740758E 49.8301058N, 18.1658503E 50.1077264N, 14.3747211E 49.1845217N, 16.5903547E 50.0875092N, 14.3413444E 50.0997878N, 14.3749342E 49.8300331N, 18.1662311E 50.0927783N, 14.3610058E 49.1845217N, 16.5903547E 49.8303617N, 18.1649597E 50.0957778N, 14.3583369E 50.0945831N, 14.3564781E 49.8421903N, 18.1570325E 49.1845217N, 16.5903547E 49.8298600N, 18.1696319E 49.8420003N, 18.1582556E 50.0997428N, 14.3746981E 49.8420003N, 18.1582556E 50.0375364N, 14.6330322EJe jich 25 (délka flagu), souřadnice na místech kde má flag pomlčky jsou stejné, a jsou v Praze, v Brně a v Ostravě (což nepomohlo). Hint odkazuje na mapy.cz. Ukáže se, že je potřeba zjistit čísla orientační budov na daných souřadnicích, a to jsou hodnoty znaků v ASCII tabulce.
$1$4lUL$c/JvvfuMWNZyIh4lOJlBi.), který se mi nepodařilo vycrackovat, jednak je tam
tacacs-server key 7 0804545A1B18360300040203641B256C770272010355Hledání ukáže že to je nějaká zoufalá obfuskace hesla, v podstatě vyxorování s univerzálním klíčem. Náhodně nalezená stránka nám řekne že heslo je
ExtraStrong.Pa$$W0rd#. To se pak řekne wiresharkovému dissectoru (Preferences → Protocols → TACACS+) a když si pak dáme filtr tcp.port == 49 a proklikáme si pakety, tak tam někde je flag.
aircrack-ng vacuum_cleaner.pcap -w wordlist.txtale pokud máme přístup k GPU, tak bude rychlejší hashcat. Tomu je potřeba data předzpracovat pomocí programu
cap2hccapx z hashcat-utils.
$ cap2hccapx.bin vacuum_cleaner.pcap a.hccapxZískaný soubor pak můžeme dát hashcatu.
$ hashcat -m 2500 -a 0 a.hccapx Top2Billion-probable-v2.txtPoužil jsem svůj oblíbený Probable Wordlist. Heslo
Goodluck2 je na pozici kolem 15 milionů, což na GTX 1080Ti trvá asi půl minuty (450 kkey/s), na lowendovém notebooku (2 kkey/s) by to trvalo dvě hodiny. Kamarád reportoval že bylo podstatně výhodnější použít krátký wordlist a mutační pravidla která to velké písmeno na začátku a číslici na konci dají podstatně rychleji než po 15 milionech pokusů.
Heslo se následně zadá do Wiresharku (Preferences → Protocols → IEEE 802.11 → Decryption keys), přičemž je ve tvaru heslo:SSID (z hashcatu to vypadne jako SSID:heslo a já to samozřejmě zadal blbě a pak jsem dlouho zkoumal proč to nefunguje). Pak už vidíme DNS dotaz na _flag.example.com a v odpovědi flag.
Mimochodem neznáte nějakou službu hashcat-as-a-service pro lidi líné a bez hardwaru? Samozřejmě je možné si naprovisionovat VPSku s GPU z Amazon AWS nebo Google Cloudu, případně to dát spočítat na něco jako Vast.ai, ale kdo se o to má starat. Kdysi existoval CloudCracker, který byl neflexibilní a teď už láme jenom DES.
50�6'36.4693"N, 14�26'52.7475"E 62�3'52.6244"N, 14�22'3.22657"E 59�6'16.6773"N, 20�24'36.9470"E 56�7'11.2941"N, 14�24'17.2524"ENejdřív ho převedeme do UTF-8 protože znak ° je blbě
$ zcat drone_flight.gps.gz|recode iso-8859-1..utf8 > drone.utfa teď už stačí jenom napsat
$ gpsprune drone.utfa flag si přečíst.
Někteří si nepřečetli zadání, ze kterého vyplývá, že ty znaky na začátku jsou B-1084, a pak tápali, co je v daném fontu 0, B a 8.
5f43 0x5ePhotorec, binwalk ani hledání NTFS Alternate Data Streams nepřineslo nic zajímavého. Zprubujeme oddíly pomocí
kpartx -a seventh_element.dd a pak můžeme úplně všechno namountovat (/dev/mapper/loop0pX) a soubory si přečíst.
Napadne nás, že to je nějaká datová struktura, přičemž znaky na prvním řádku jsou hexa bajty odpovídající ASCII písmenkům a na druhém řádku je číslo oddílu na který se máme podívat dál. Tak si tu strukturu nakreslíme jako orientovaný graf (předpokládám, že soubory jsme si zkopírovali jako file1 až file128):
$ (echo "digraph{"; for i in `seq 1 128`; do tar=$(( $(hexdec `tail -n 1 file$i|cut -c 3-`) + 1 )); echo "file$i->file$tar;"; done; echo "}") > xx.dot
(tu +1 jsem tam napsal protože když číslujeme od nuly tak to nefunguje, resp. podle toho jak přesně to děláte tak vám to dokonce řekne WARNING{Indexing from 1? Are you pathetic human?})
pozn. soubor xx.dot nyní obsahuje něco takového, o Dotu a dalších nástrojích už chci delší dobu napsat článek:
digraph{
file1->file28;
file2->file110;
file3->file45;
file4->file101;
file5->file63;
file6->file69;
file7->file13;
file8->file86;
file9->file4;
Orientovaný graf zpracujeme Dotem:
$ dot -T png xx.dot > a.png
Tak řekněme že to prostě projdeme a tady je hned vidět v jakých dvou bodech dává smysl začít.
#!/usr/bin/env python3
import sys,os
def readfile(fname, mode="r"):
f = open(fname, mode)
d = f.readlines()
f.close()
return d
l=[]
fname = sys.argv[1]
while True:
#print("next: %s"%fname)
d = readfile(fname)
nf = int(d[1], 16)+1
print("%s %s %02x"%(fname,d[0].strip(),nf))
fname = "file%i"%nf
if fname in l:
break
l.append(fname)
$ ./graph.py file7|cut -d " " -f 2 | blhexbin
FLAG{tPJ4-idCH-GWlh-JjL8}
Tiskni
Sdílej:
#!/usr/bin/python
import sys
data = sys.argv[1]
key = sys.argv[2]
buckets = []
keyLen = len(key)
seq = [ None ] * keyLen
read = 0
chidx = 0
totalLen = 0
for chpos in range(0, 26):
found = True
while found:
found = True
ch = chr(ord('a')+chpos)
if ch not in key:
found = False
break
idx=key.index(ch)
k=list(key)
k[idx]='#'
key="".join(k)
seq[idx] = chidx+1
chidx +=1
totalLen += chidx
print("totalLen: "+str(totalLen))
print("dataLen: "+str(len(data)))
if totalLen < len(data):
repeats = len(data) / totalLen
seqLen = len(seq)
for j in range(0, int(repeats)-1):
for i in range(0, seqLen):
seq.append(seq[i])
bucket = 0
bucket_pos = 0
for c in data:
if bucket >= len(buckets):
buckets.append([ c ])
else:
buckets[bucket].append(c)
bucket_pos += 1
if bucket_pos >= seq[bucket]:
bucket += 1
bucket_pos = 0
if bucket >= len(seq):
bucket = 0
bucket_pos = 0
i = 0
c=1
for j in range(0, 100):
found = False
for i in range(0, len(seq)):
if j < len(buckets[i]):
if c % 2 == 0:
endch=" "
else:
endch=""
print(buckets[i][j], end=endch)
c+=1
else:
continue
print()
A wrapper roche.sh:
#!/bin/bash
data=`cat colonel_roche.encrypted`
keys=("monday" "monday" "monday" "monday" "monday" "monday" "monday" "monday")
offset=0
chunkSize=0
dataSize=`echo -n "$data"|wc -c`
keyIdx=0
while [ $offset -lt $dataSize ]; do
key=${keys[$keyIdx]}
chunkSize=0
for i in $(seq 1 $(echo -n $key|wc -c)); do
let chunkSize=$chunkSize+$i
done
#echo "chunkSize: $chunkSize"
workChunk=$(echo "$data"|tail -c +$(expr $offset + 1)|head -c $chunkSize)
echo "workChunk: $workChunk"
echo "key: $key"
if [ -z "$key" ]; then
break
fi
ANS="$ANS $(./roche.py $workChunk $key|grep -v Len)"
echo
let offset=$offset+$chunkSize
let keyIdx=$keyIdx+1
done
echo $ANS|xxd -r -ps
#!/usr/bin/python
import matplotlib.image as img
import numpy as np
import scipy.misc
from PIL import Image
mimg = Image.open("m.png")
cimg = Image.open("c.png")
m = np.array(mimg)
c = np.array(cimg)
mcsq = c * c * m
scipy.misc.imsave("mcsq.png", mcsq)
Tady byla trochu zrada, kdyz clovek pouzil matplotlib.image.imread, tak to normalizovalo data v obrazku na 0...1 (misto 0..255), takze to pak nevychazelo).