Strikamerki, QR-kóðar og ljóskennsl stafa
Ferningur skipaður svörtum og hvítum reitum getur hýst vefslóð, texta eða næstu vísbendingu rannsóknarinnar. Röð strika getur hæglega falið tilteknar tölur. Óskýr ljósmynd af miða getur umbreyst í leitanlegan texta með tilstyrk ljóskennsla.
Innan ramma gagnaglímuverkefna þjóna þessi form iðulega einvörðungu sem eitt gagnasvið af mörgum:
mynd → QR-kóði → vefslóðarkóðun → Base64 → fáni
Markmiðið er því síst af öllu fólgið í því einu að „skanna kóðann“. Okkur ber að rýna í hin afkóðuðu gögn löngu áður en við nýtum okkur þau.
QR-kóðar teljast vera ótraust ílagsgögn
Kóðar geta hæglega hýst varasamar vefslóðir, greiðslubeiðnir, þráðlausar netstillingar eða jafnvel texta sem forritum er ætlað að framkvæma. Ráðið fyrst úr kóðanum á textaformi. Vinsamlegast gætið þess að vitja síst vefslóða eða samþykkja aðgerðir með sjálfvirkum hætti.
Strikamerki og QR-kóðar
Strikamerki (e. barcode) hýsir upplýsingar í tilteknu mynstri sem tölvubúnaði er unnt að ráða úr. Einvíðar gerðir strikamerkja styðjast að jafnaði við mismunandi breidd strika og bila í eina tiltekna átt. Tvívíðir kóðar nýta hins vegar meira rými og geta því varðveitt umfangsmeiri gögn.
QR-kóði (e. Quick Response code) telst til tvívíðra kóða og samanstendur af smáum einingum, iðulega svörtum og hvítum ferningum.
Hinir auðþekkjanlegu og viðamiklu ferningar í þremur hornum kóðans vísa lesaranum veginn að réttri stefnu hans. Smágerðari mynstur hlutast svo til um röðun, útgáfu og sjálfvirka villuleiðréttingu.
Vissir þú?
QR-kóðinn leit dagsins ljós árið 1994 hjá fyrirtækinu Denso Wave, en honum var upphaflega ætlað það hlutverk að halda utan um íhluti í japanskri bifreiðaframleiðslu. Quick Response vísar til þess að kóðinn átti að vera fljótlesinn úr ólíkum áttum.
Hefjum leikinn á óhreyfðri mynd
Við skulum hefja leikinn á því að rýna í skráarsnið og gildleika:
file kodi.png
magick identify kodi.png
exiftool kodi.png
Í kjölfarið skulum við láta reyna á staðbundin afkóðunarverkfæri. zbarimg styður meðal annars QR og mörg einvíð strikamerki:
zbarimg kodi.png
Eigi að draga fram hið hráa nytjahlass eitt og sér:
zbarimg --raw kodi.png
Mögulegt frálag:
https://ctf.example/next?data=%67%67%7Bqr_er_texti%7D
Varað er við því að vitja vefslóðarinnar undireins. Giftudrjúgara er að vista hana eða fela ljóskennslum frekari úrvinnslu.
zbarimg --raw kodi.png > afkodad.txt
file afkodad.txt
Látið reyna á einfaldasta afbrigðið í upphafi
Vandaður lesari hlutast iðulega til um leiðréttingu á 90° snúningi og nýtir sjálfvirka villuleiðréttingu. Forðist því að skerpa myndina, beita þröskuldun eða speglun ef unnt reynist að lesa hana í sínu upprunalega horfi.
Æfing: hvað kemur næst?
Æfing 1
QR-lesari skilar:
https://example.invalid/login?user=nemandi&token=abc123
Hvert skyldi teljast farsælasta vinnuskrefið í kjölfarið?
- Vitja vefslóðarinnar í hversdagslegum vafra og hlutast til um innskráningu.
- Rýna í textann og greina þáttun slóðarinnar án þess að tengjast netinu.
- Varpa textanum fram sem skipun í skel.
Lausn við æfingu 1
Kostur 2 telst óhultastur. Okkur er unnt að rannsaka slóðina sem hrein gagnasöfn:
from urllib.parse import parse_qs, urlparse
slod = "https://example.invalid/login?user=nemandi&token=abc123"
hlutar = urlparse(slod)
print(hlutar.scheme) # https
print(hlutar.hostname) # example.invalid
print(hlutar.path) # /login
print(parse_qs(hlutar.query))
Lénið .invalid er frátekið fyrir dæmi og á ekki að virka. Hvorki innskráning né keyrsla í skel er nauðsynleg til að lesa nytjahlassið.
Ráðum úr vefslóðarkóðun án þess að vitja slóðarinnar
Prósentumerkingar innan vefslóða geta gefið einstök bæti til kynna. Python-málinu er í lófa lagið að ráða úr þeim:
from urllib.parse import unquote
texti = "%67%67%7Bqr_er_texti%7D"
print(unquote(texti))
Frálag:
gg{qr_er_texti}
Með þessu móti höfum við einvörðungu rýnt í textann sjálfan, án þess að nokkur vefbeiðni hafi verið varpað af stað.
Kóðinn gæti líka skilað:
WIFI:T:WPA;S:...fyrir Wi-Fi-stillingu,BEGIN:VCARDfyrir tengilið,otpauth://...fyrir auðkennislykil,mailto:eðatel:fyrir aðgerð,- Base64, hex eða JSON,
- annarri mynd eða skrá.
Þessi forskeyti gefa forritum til kynna hvað þau kynnu að geta tekið sér fyrir hendur. Við skulum því nálgast öll gögn sem hreinan texta í fyrstu.
Þegar QR-kóði reynist torlæs
Meðal algengra orsaka má nefna:
- kóðinn er of lítill eða óskýr,
- hann er skorinn við brún,
- hinu hvíta jaðarsvæði er ekki til að dreifa,
- birtuskil eru lítil,
- myndin er spegluð,
- sjónarhornið skekkir ferninginn,
- hluti kóðans hefur sætt skemmdum,
- myndin var vistuð sem tapsþjappað JPEG.
Við skulum smíða tiltekin afrit og gæta þess að hrófla einungis við einu atriði í senn.
Stækkun með varðveislu skerpu
QR-kóði hvíli á skörpum og afmörkuðum einingum. Beiting svokallaðrar næsta nágranna-aðferðar (e. nearest neighbor) tryggir að köntunum sé viðhaldið:
magick kodi.png -filter point -resize 400% nidurstodur/kodi-stor.png
Viðbót hvíts jaðars
Hvíta svæðið utan um kóða kallast kyrrt svæði (e. quiet zone). Lesari þarf það til að aðgreina kóðann frá bakgrunni.
magick kodi.png -bordercolor white -border 40 nidurstodur/kodi-jadar.png
Snúningur og speglun
magick kodi.png -rotate 90 nidurstodur/kodi-90.png
magick kodi.png -flop nidurstodur/kodi-spegill.png
magick kodi.png -flip nidurstodur/kodi-lodrett.png
-flop speglar lárétt en -flip lóðrétt.
Grátónar og beiting þröskuldar
magick kodi.png \
-colorspace Gray \
-threshold 55% \
nidurstodur/kodi-svart-hvitt.png
Beiting þröskuldar (e. threshold) getur reynst giftudrjúg þegar bakgrunnurinn er ójafn, þótt hafa beri í huga að rangt valið gildi getur þurrkað út mikilvægar einingar. Við skulum láta reyna á nokkur gildi með kerfisbundnum hætti og leggja mat á muninn.
Útskurður kóða úr umfangsmikilli mynd
magick mynd.png -crop 600x600+120+80 +repage nidurstodur/kodi-skordur.png
Merkingin er:
breidd x hæð + x-hliðrun + y-hliðrun
600 600 120 80
Rétt er að skilja eftir hógværan hvítan jaðar, sé þess nokkur kostur.
Varað er við því að vista vinnuafrit á JPEG-formi
JPEG getur búið til óskýra kanta og litlar sveiflur við hverja einingu. PNG er betra vinnusnið fyrir svarta og hvíta kóða.
Æfing: röð umbreytinga
Æfing 2
QR-kóði er aðeins 80×80 dílar, snýr á hlið og snertir brún myndarinnar. Hvaða þrjú einföldu vinnuskref skyldu teljast farsæl, löngu áður en lagt er í viðamiklar viðgerðir?
Lausn við æfingu 2
Rökrétt röð aðgerða er þessi:
- snúa myndinni um 90°,
- stækka með
-filter point, - bæta við hvítum jaðri.
Til dæmis:
magick kodi.png \
-rotate 90 \
-filter point -resize 400% \
-bordercolor white -border 40 \
nidurstodur/kodi-lagadur.png
zbarimg --raw nidurstodur/kodi-lagadur.png
Ráðlegt er að láta reyna á lesarann að loknu hverju vinnuskrefi. Þá vitum við hvaða breyting var nauðsynleg.
Villuleiðrétting telst síst til töfrabragða
QR-kóðar hýsa viðbótarupplýsingar svo lesaranum reynist unnt að endurheimta gögn, jafnvel þótt hluti kóðans hafi orðið fyrir skemmdum. Stigin eru L, M, Q og H. Þeim er oft lýst þannig að hægt sé að endurheimta um 7%, 15%, 25% og 30% skemmdra kóðaorða (e. codewords), en raunhæf geta fer eftir staðsetningu og eðli skemmdarinnar.
Skemmdir sem ná til staðsetningarferninganna, sjálfs sniðsins eða umfangsmikilla og samfelldra hluta, geta reynst okkur dýrkeyptari en dreifðir og smágerðir blettir. Af þessu leiðir að okkur er óheimilt að draga þá ályktun að „30% myndflatarins megi vanta með öllu“.
Í CTF getum við stundum:
- endurgert augljóst staðsetningarmynstur,
- sameinað tvo kóða sem skemmast á ólíkum stöðum,
- rétt sjónarhorn,
- nýtt villuleiðréttingu eftir að jaðar og einingastærð eru rétt.
Við skulum einskorða allar breytingar við afrit og færa nákvæmlega til bókar hvað það var sem ritað var eða endurgert.
Einvíðar gerðir strikamerkja
Algeng snið eru meðal annars:
- EAN-13 á vörum,
- Code 128 fyrir fjölbreyttan texta,
- Code 39 fyrir einfalt stafasett,
- UPC-A.
zbarimg getur greint mörg þeirra:
zbarimg strikamerki.png
Einvíðar gerðir strikamerkja útheimta iðulega:
- nægilega lárétta upplausn,
- skýra kanta,
- autt svæði við báða enda,
- rétta stefnu,
- öll strikin óskorin.
Meðferð vartölu í EAN-13 sniði
Síðasti tölustafur EAN-13 er vartala (e. check digit). Hlutverk herber er að leiða í ljós fjölmargar hversdagslegar innsláttar- og lesvillur, en henni er síst af öllu ætlað að þjóna sem dulritunarvörn.
Fyrir fyrstu tólf tölurnar:
5 9 0 1 2 3 4 1 2 3 4 5
leggjum við saman tölur í oddasætum og þrefalt summu talna í jafnsætum, talið frá vinstri:
oddasæti: 5 + 0 + 2 + 4 + 2 + 4 = 17
jafnsæti: 9 + 1 + 3 + 1 + 3 + 5 = 22
summa: 17 + 3×22 = 83
Vartalan fyllir upp í næsta tug:
(10 - (83 mod 10)) mod 10 = 7
Heili kóðinn er því:
5901234123457
Æfing: staðfestu vartölu
Æfing 3
OCR les EAN-kóða sem:
5901234123451
Samræmist síðasti tölustafurinn vartölunni sem við reiknuðum?
Lausn við æfingu 3
Nei. Fyrstu tólf tölurnar 590123412345 gefa vartöluna 7, ekki 1.
Þetta bendir til OCR- eða lesvillu. Við skoðum myndina aftur og prófum strikamerkjalesara. Réttur kóði samkvæmt útreikningnum er:
5901234123457
Vartalan megnar síst af öllu að ljóstra upp um hver af fyrri tölunum reynist röng, fari svo að villurnar séu fleiri en ein; hún ber þess einvörðungu vitni að talnarunan stenst síst af öllu þessa athugun.
Ljóskennsl stafa
Ljóskennsl stafa (e. optical character recognition, OCR) hlutast til um að umbreyta myndrænum texta yfir í stafi sem okkur er fært að leita í og vinna með með tæknilegum hætti.
Tesseract er opið OCR-tól:
tesseract texti.png stdout
Fyrir eina textalínu getur síðuskipanarhamur 7 hentað:
tesseract texti.png stdout --psm 7
Fyrir þéttan textablokk er hamur 6 algeng byrjun:
tesseract texti.png stdout --psm 6
Tungumál eru valin með -l ef viðeigandi tungumálagögn eru uppsett:
tesseract texti.png stdout -l isl+eng --psm 6
Undirbúum mynd fyrir OCR
magick texti.jpg \
-colorspace Gray \
-resize 300% \
-contrast-stretch 1%x1% \
nidurstodur/texti-skyr.png
Við gætum einnig prófað þröskuld eða skorið textasvæðið úr. Við skulum enn gæta þess að hrófla einungis við einu atriði í senn og bera niðurstöðuna saman við myndina sjálfa.
Algengir hnökrar við auðkenningu
OCR ruglar meðal annars:
| Mynd | Mögulegir stafir |
|---|---|
0 |
núll eða O |
1 |
einn, I eða l |
5 |
fimm eða S |
8 |
átta eða B |
{ |
slaufusvigi eða ( |
_ |
undirstrik eða eyða |
Tilskilið fánasnið og annað samhengi vísar okkur vissulega veginn við staðfestingu, en okkur ber þó síst af öllu að „leiðrétta“ sérhvern þætt sem fellur ekki að fyrirfram gefnum hugmyndum okkar.
Æfing: OCR-frambjóðendur
Æfing 4
OCR skilar:
gg(0CR_l3s_ekkl_a11t}
Myndin virðist hins vegar hafa slaufusviga eftir gg, og tveir óskýrir stafir gætu verið I, l eða 1.
Með hvaða hætti færum við sönnur á gildi fánans án þess að hrapa að ályktunum?
Lausn við æfingu 4
- Skerum hvert óskýrt svæði út og stækkum það með áherslu á skerpu kanta.
- Berum saman formgerð eins stafa annars staðar á myndfletinum.
- Prófum annan OCR-ham og mögulega
isl+engtungumálagögn. - Athugum fánasniðið: upphafið ætti líklega að vera
gg{, svo(er líkleg lesvilla. - Færum alla möguleika fyrir hina óskýru stafi til bókar, í stað þess að hnika þeim til undireins.
Mjög líklegur texti gæti verið:
gg{OCR_les_ekki_allt}
En við skila aðeins þeirri útgáfu þegar sjónræn skoðun styður O á móti 0, l á móti 1 og lokasvigann. Fánasniðið þjónar okkur sem staðfesting, en færir okkur síst af öllu heimild til þess að töfra fram nýja stafi.
Margslungin gagnasvið kóðunar
Afkóðað nytjahlass getur sjálft verið kóðað:
QR → `R0d7a29kaSBvZyB0ZXh0aX0=` → Base64 → texti
Eða QR-kóði getur innihaldið slóð á mynd með öðru strikamerki. Við spyrjum eftir hvert lag:
file nidurstada
wc -c nidurstada
head -c 100 nidurstada
Fyrir texta skoðum við:
- stafasett,
- þekkt forskeyti,
- vefslóðarkóðun,
- Base64 eða hex,
- JSON eða XML,
- hvort textinn sé í raun skráarauðkenni í kóðuðu formi.
Eitt gagnasvið, ein færsla sannanna
Færið ferlið til bókar sem QR → slóðarafkóðun → Base64 → PNG, í stað þess að láta ykkur nægja ummæli á borð við „beitti CyberChef“. Með því móti reynist unnt að endurtaka lausnarferlið og leiða í ljós hvar vafasamar forsendur kunna að hafa skotið upp kollinum.
Mótun skaðlauss æfingaviðfangsefnis
qrencode getur búið til QR-mynd úr texta:
qrencode -o aetfing.png 'gg{eg_bjo_til_qr}'
zbarimg --raw aetfing.png
Okkur er í kjölfarið fært að smíða afbakað afrit, til dæmis snúið og minnkað, en höldum upprunalega kóðanum svo hægt sé að bera saman:
magick aetfing.png -rotate 90 -resize 25% aetfing-skemmd.png
Hér er á ferðinni trygg leið til þess að þjálfa notkun verkfæra, án þess að freista þess að skanna ókunnar kóðar af götunni eða miðla myndum til vefþjónustna.
Persónuvernd og úrvinnsla ljóskennsla
Beiting skýjaþjónustu við ljóskennsl stafa eða afkóðun QR-kóða felur í sér að myndinni er miðluð til utanaðkomandi aðila. Myndin gæti innihaldið:
- nöfn,
- heimilisföng,
- skjöl í bakgrunni,
- staðsetningarlýsigögn,
- aðgangslykla í kóðum.
Við notum staðbundin tól fyrir viðkvæm gögn og aðeins tilbúnar CTF-myndir í utanaðkomandi þjónustum.
Lokaverkefni: miðinn á veggnum
Æfing 5
Verkefnið gefur ljósmyndina veggur.jpg. Hún sýnir lítinn, speglaðan QR-kóða og óskýra handskrifaða línu fyrir neðan.
Eftir QR-afkóðun fæst:
data=%52%30%64%37%61%32%39%6b%61%53%42%76%5a%79%42%30%5a%58%68%30%61%58%30%3D
Ritið niður rökstutta og skipulega leið frá myndinni sjálfri að hinni endanlegu niðurstöðu, og gætið þess að nefna viðeigandi öryggisathuganir.
Möguleg lausn við æfingu 5
- Halda óbreyttu afriti af
veggur.jpgog búa tilnidurstodur/. - Skera QR-svæðið út með smá jaðri.
- Spegla afritið með
-flop, stækka með-filter pointog bæta við hvítum jaðri ef þarf. - Ráðið úr kóðanum á textaformi, en forðist hvers kyns sjálfvirkar aðgerðir:
zbarimg --raw nidurstodur/qr-lagadur.png > nidurstodur/qr.txt
- Þáttum
data=og afkóðum prósenturnar án netbeiðni:
from urllib.parse import parse_qs, unquote
texti = open("nidurstodur/qr.txt").read().strip()
gildi = parse_qs(texti)["data"][0]
print(unquote(gildi))
parse_qs afkóðar prósenturnar sjálft, svo niðurstaðan verður Base64-lík runa.
- Afkóða Base64 og skoða textann:
printf '%s' 'R0d7a29kaSBvZyB0ZXh0aX0=' | base64 -d
Niðurstaðan er:
GG{kodi og texti}
- OCR-greina handskrifuðu línuna sérstaklega, en staðfesta hana sjónrænt. Sú lína gæti hæglega gefið til kynna hvort hnika skuli til hástöfum, eyðum eða svigum svo niðurstaðan falli að tilskildu fánasniði.
- Ekki opna slóðir, keyra afkóðaðan texta eða hlaða ljósmyndinni í skýjaþjónustu án heimildar.
Athugum að frálagið er ekki enn á venjulega gg{...} sniðinu. Ef handskrifaða línan segir „allt með lágstöfum, bil verða undirstrik“ verður lokafáninn:
gg{kodi_og_texti}
Við gerum þessa breytingu aðeins ef vísbendingin segir það.
Samantekt
Í þessum kafla lærðum við að:
- strikamerki og QR-kóðar teljast til gagnasniða, en síst af öllu til sjálfvirkra öryggisráðstafana,
zbarimg --rawafkóðar í texta án þess að opna slóð,- við getum stækkað, snúið, speglað, þröskuldað og skorið kóða á afritum,
- viðunandi hvítur jaðar og skerpa einingakanta hafa veigamiklu hlutverki að gegna við afkóðun,
- villuleiðrétting QR-kóða megnar að ráða bót á tilteknum skemmdum, en síst af öllu sérhverjum þeim 30% myndflatarins sem vanta kynni,
- vartala strikamerkja dregur fram vísbendingar um villur, en færir okkur síst af öllu sönnur á uppruna eða heilleika gagna,
- ljóskennsl (OCR) varpa fram textaframbjóðanda sem útheimtir ætíð sjónræna staðfestingu rannsakanda,
- afkóðað nytjahlass getur verið vefslóð, Base64, JSON eða annað lag,
- við skoðum afkóðaðar slóðir án þess að heimsækja þær,
- við sendum ekki viðkvæmar myndir í utanaðkomandi OCR- eða QR-þjónustur.
Í eftirfarandi kafla munum við beina sjónum okkar að Unicode-staðlinum, stöfum sem deila nákvæmlega sama útliti, núllbreiddarstöfum, stefnustýringu texta og skilaboðum sem kunna að fela sig innan um hversdagsleg millibil.