Byla vydána (Mastodon, 𝕏) nová stabilní verze 2.0 otevřeného operačního systému pro chytré hodinky AsteroidOS (Wikipedie). Přehled novinek v oznámení o vydání a na YouTube.
WoWee je open-source klient pro MMORPG hru World of Warcraft, kompatibilní se základní verzí a rozšířeními The Burning Crusade a Wrath of the Lich King. Klient je napsaný v C++ a využívá vlastní OpenGL renderer, pro provoz vyžaduje modely, grafiku, hudbu, zvuky a další assety z originální kopie hry od Blizzardu. Zdrojový kód je na GitHubu, dostupný pod licencí MIT.
Byl představen ICT Supply Chain Security Toolbox, společný nezávazný rámec EU pro posuzování a snižování kybernetických bezpečnostních rizik v ICT dodavatelských řetězcích. Toolbox identifikuje možné rizikové scénáře ovlivňující ICT dodavatelské řetězce a na jejich podkladě nabízí koordinovaná doporučení k hodnocení a mitigaci rizik. Doporučení se dotýkají mj. podpory multi-vendor strategií a snižování závislostí na vysoce
… více »Nizozemský ministr obrany Gijs Tuinman prohlásil, že je možné stíhací letouny F-35 'jailbreaknout stejně jako iPhony', tedy upravit jejich software bez souhlasu USA nebo spolupráce s výrobcem Lockheed Martin. Tento výrok zazněl v rozhovoru na BNR Nieuwsradio, kde Tuinman naznačil, že evropské země by mohly potřebovat větší nezávislost na americké technologii. Jak by bylo jailbreak možné technicky provést pan ministr nijak nespecifikoval, nicméně je známé, že izraelské letectvo ve svých modifikovaných stíhačkách F-35 používá vlastní software.
Nové číslo časopisu Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 162 (pdf).
Sdružení CZ.NIC, správce české národní domény, zveřejnilo Domain Report za rok 2025 s klíčovými daty o vývoji domény .CZ. Na konci roku 2025 bylo v registru české národní domény celkem 1 515 860 s koncovkou .CZ. Průměrně bylo měsíčně zaregistrováno 16 222 domén, přičemž nejvíce registrací proběhlo v lednu (18 722) a nejméně pak v červnu (14 559). Podíl domén zabezpečených pomocí technologie DNSSEC se po několika letech stagnace výrazně
… více »Google představil telefon Pixel 10a. S funkci Satelitní SOS, která vás spojí se záchrannými složkami i v místech bez signálu Wi-Fi nebo mobilní sítě. Cena telefonu je od 13 290 Kč.
Byl publikován přehled dění a novinek z vývoje Asahi Linuxu, tj. Linuxu pro Apple Silicon. Fedora 43 Asahi Remix s KDE Plasma už funguje na M3. Zatím ale bez GPU akcelerace. Vývojáře lze podpořit na Open Collective a GitHub Sponsors.
Red Hat představil nový nástroj Digital Sovereignty Readiness Assessment (GitHub), který organizacím umožní vyhodnotit jejich aktuální schopnosti v oblasti digitální suverenity a nastavit strategii pro nezávislé a bezpečné řízení IT prostředí.
BarraCUDA je neoficiální open-source CUDA kompilátor, ale pro grafické karty AMD (CUDA je proprietární technologie společnosti NVIDIA). BarraCUDA dokáže přeložit zdrojové *.cu soubory (prakticky C/C++) přímo do strojového kódu mikroarchitektury GFX11 a vytvořit tak ELF *.hsaco binární soubory, spustitelné na grafické kartě AMD. Zdrojový kód (převážně C99) je k dispozici na GitHubu, pod licencí Apache-2.0.
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).