Hoppa yfir í efnið

Leynd gagnasöfn innan myndskráa

Hefðbundin dulritun miðar að því að hylja sjálfa merkingu skilaboðanna. Launritun (e. steganography) leitast hins vegar við að fela þá staðreynd að nokkur skilaboð séu yfirleitt til staðar.

Myndskrá kann að virðast vera hversdagsleg landslagsmynd, en geyma engu að síður:

  • texta í lýsigögnum,
  • ZIP-kippuskrá aftan við myndgögnin,
  • skilaboð sem leynast í einni litrás,
  • liti sem hvíla í algerlega gegnsæjum dílum,
  • bita sem sætt hafa lítilfjörlegum breytingum í sérhverjum díl,
  • viðauka sem sérstök launritunarverkfæri fá skorið út.

Í þessum kafla munum við beina sjónum okkar að viðfangsefnum úr gagnaglímum og tilbúnum myndskrám. Við skulum ætíð hefja leikinn á einföldum prófunum, fremur en að ræsa fjölmörg launritunarverkfæri samtímis.

Launritun og dulritun geta unnið saman

Leynd gagnasöfn geta sömuleiðis verið dulkóðuð. Við þær kringumstæður ríður á að hafa fyrst uppi á gögnunum og hlutast svo til um dulráðningu þeirra. Sú staðreynd að rekast á tilviljunarkennda bætarunu telst því engan veginn vera lokaniðurstaða rannsóknarinnar.

Hvar gætu gögnin verið?

Giftudrjúgt er að hefja rannsóknina á eftirfarandi hátt:

file mynd.png
exiftool mynd.png
xxd -l 32 mynd.png
strings -n 8 mynd.png

Við skulum leggja eftirfarandi spurningar fyrir okkur:

  1. Fellur skráarendingin sannanlega að skráarsniðinu?
  2. Lúta athugasemdir eða óvenjuleg lýsigögn þar í leyni?
  3. Hýsir skráin viðbótargögn eða framandi skráarauðkenni?
  4. Er myndin óhóflega umfangsmikil miðað við upplausn hennar?
  5. Er þar alfa-rás eða sértækri litrás fyrir að fara?
  6. Varpar lýsing verkefnisins ljósi á meðferð bita, lita, gagnsæis eða gagnasviða?

Launritun telst aðeins til einnar af mörgum mögulegum tilgátum. Innan ramma margra byrjendaverkefna reynist „leynd mynd“ iðulega vera ZIP-kippuskrá sem skeytt hefur verið aftan við PNG-skrá, eða hreinlega texti í Comment-reitnum.

Æfing: hvaða feluaðferð?

Æfing 1

Leiddu í ljós hver af eftirfarandi athugunum vísar veginn að vænlegasta næsta vinnuskrefi:

  1. exiftool sýnir Comment: Z2d7....
  2. strings sýnir PK og flag.txt undir lok PNG-skrár.
  3. Verkefnalýsingin segir „blár er uppáhaldsliturinn minn“.
  4. Myndin er með alfa-rás og stór hluti hennar er ósýnilegur.

Næstu skref eru: skoða Base64, leita að ZIP-gögnum, einangra bláu litrásina og skoða RGB-gildi gegnsærra díla.

Lausn við æfingu 1
  1. Comment: Z2d7...prófa Base64, því stafasettið og reiturinn styðja þá tilgátu.
  2. PK og flag.txtleita að ZIP-gögnum og staðfesta þau með ZIP-tóli.
  3. Vísbending um bláan lit → einangra bláu litrásina.
  4. Gegnsæ myndsvæði → skoða RGB-gildi gegnsærra díla eða alfa-rásina sjálfa.

Litrásir

Litrásir (e. colour channels) hlutast til um að aðgreina þau tölugildi sem skipa liti eða aðra eiginleika myndar. Innan RGB-myndar skartar sérhver díll að jafnaði þremur litgildum:

R = rautt
G = grænt
B = blátt

RGBA-sniðið bætir svo við hinni svokölluðu alfa-rás, sem hefur það hlutverk að stýra gagnsæi.

Díll = (R, G, B, A)

Skilaboð kunna að vera deginum ljósari í einni tiltekinni rás, en hverfa sjónum okkar hvenær sem rásirnar blandast saman í eina heild.

Rásaaðskilnaður með tilstyrk ImageMagick

magick mynd.png -channel R -separate nidurstodur/raud.png
magick mynd.png -channel G -separate nidurstodur/graen.png
magick mynd.png -channel B -separate nidurstodur/bla.png

Alfa-rás:

magick mynd.png -alpha extract nidurstodur/alfa.png

Okkur er fært að auka birtuskil á nýrri niðurstöðumynd:

magick nidurstodur/bla.png -auto-level nidurstodur/bla-skyr.png

Varað er við því að myndbreytingar smíði ný gögn

Aðgerðir á borð við -auto-level, litaviðsnúning og aðra vinnslu umbreyta myndinni. Slíkt getur vissulega dregið fram mynstur, en telst þó síst til frumgagna. Færið skipunina til bókar og gætið þess að varðveita sjálfa verkefnisskrána óhreyfða.

Vissir þú?

Litmynd á skjá myndast við samruna rauðs, græns og blás ljóss. Þegar við einangrum rás erum við ekki að „finna leynilegt lag“ í öllum myndum; við vörpum einu tilteknu talnagildi úr sérhverjum díl fram sem grámynd.

Æfing: hvaða rás?

Æfing 2

Myndin virðist vera nær algrá, en í Comment-reitnum má lesa eftirfarandi:

G er ekki bara fyrir grænt — það geymir svarið.

Hvaða skipun skyldi teljast vænlegust til árangurs í upphafi?

Lausn við æfingu 2

Við skulum því einangra hina grænu litrás:

magick mynd.png -channel G -separate nidurstodur/graen.png

Reynist skilaboðin vera með daufasta móti, er okkur fært að smíða annað afrit til stuðnings:

magick nidurstodur/graen.png -auto-level nidurstodur/graen-skyr.png

Við skulum forðast að láta reyna á allar hugsanlegar umbreytingar í upphafi; tilvísunin í bókstafinn G og litinn grænan renna stoðum undir þessa rannsóknarleið.

Gagnsæir dílar geta hýst litagildi

Gildið 0 í alfa-rás gefur að jafnaði til kynna að díllinn telst fyllilega gegnsær. RGB-litagildin geta hins vegar hæglega verið fyrir hendi:

(255, 0, 0, 0)

Myndvinnsluforrit munu síst af öllu sýna okkur nokkurn rauðan díl sökum alfa-gildisins, þrátt fyrir að hin hráu litgildi beri þess vitni að þar sé rautt á ferð. Höfundur gagnaglímuverkefnis getur þannig teiknað skilaboð með RGB-gildum einum saman og hulið þau sjónum okkar með tilstyrk alfa-rásarinnar.

Ein leið til þess að láta alfa-rásina sem vind um eyru þjóta er að varpa myndinni fram á kunnuglegum bakgrunni eða rýna í litrásirnar hverja fyrir sig. Með ImageMagick-verkfærinu er okkur til að mynda fært að þurrka út alfa-rásina á hvítum bakgrunni:

magick mynd.png -background white -alpha remove -alpha off nidurstodur/an-alfa.png

Slík aðferð færir okkur þó síst af öllu ávallt þau RGB-gildi sem dulið var undir fyllstu gagnsæi á þann hátt sem okkur er hugleikið. Rásaaðskilnaður eða hnitmiðað Python-forrit færir okkur hins vegar mun nákvæmari stjórn á viðfangsefninu.

Sýnidæmi með Pillow

Eftirfarandi dæmi þarf Python-safnið Pillow:

from PIL import Image

mynd = Image.open("mynd.png").convert("RGBA")

for i, (r, g, b, a) in enumerate(mynd.getdata()):
    if a == 0 and (r, g, b) != (0, 0, 0):
        print(i, r, g, b)

Forritinu er ætlað að hafa uppi á dílum sem teljast fyllilega gegnsæir en hýsa engu að síður tiltekin litagildi. Það sannar ekki að þau myndi skilaboð, en gefur okkur mælanlega vísbendingu.

Gildislægsti bitinn

Sérhvert litgildi er iðulega skipað tölu á bilinu 0 til 255, sem jafngildir átta bitum. Gildislægsti bitinn (e. least significant bit, LSB) er sá biti sem skipar sér lengst til hægri og hefur því minnst áhrif á sjálfa töluna.

200 = 11001000
201 = 11001001
               ↑ aðeins síðasti bitinn breyttist

Hversdagslegum rannsakanda reynist jafnan þrautin þyngri að greina breytingu á rauðu litgildi úr 200 yfir í 201. Hins vegar getur þessi síðasti biti hæglega hýst annaðhvort 0 eða 1. Takist okkur að safna saman einum bita úr fjölmörgum dílum, getum við hæglega mótað úr þeim heilt bæti og í kjölfarið ritað texta.

Sýnidæmi: eitt bæti í átta gildum

Rauðu gildin eru:

100, 101, 102, 104, 106, 108, 110, 111

Við skulum láta okkur nægja að rýna í sjálfan lokabitann, eða sem jafngildir því, kanna hvort um slétta tölu eða oddatölu sé að ræða:

100 → 0
101 → 1
102 → 0
104 → 0
106 → 0
108 → 0
110 → 0
111 → 1

Bitarnir verða:

01000001

Það er 0x41, ASCII-stafurinn A.

Æfing: lestu LSB

Æfing 3

Taktu gildislægsta bita talnanna:

120, 121, 122, 125, 126, 128, 131, 133

Skeytið bitunum saman frá vinstri til hægri og ráðið úr þeim með hliðsjón af ASCII-staðlinum.

Lausn við æfingu 3

Oddatölur færa okkur gildið 1 en sléttar tölur skila núlli:

120 → 0
121 → 1
122 → 0
125 → 1
126 → 0
128 → 0
131 → 1
133 → 1

Bitarnir eru:

01010011

01010011 er 0x53, ASCII-stafurinn S.

Ekki öll bitamynstur eru texti

Leyndu gögnin kunna hæglega að reynast vera myndskrá, ZIP-kippuskrá, þjöppuð talnaruna eða jafnvel dulkóðuð bæti. Hafið því ætíð augun opin fyrir skráarauðkennum á borð við PK, %PDF eða PNG, löngu áður en þið gefið ykkur að þarna sé hreinræktaður UTF-8 texti á ferð.

Lesum LSB með Python

Pillow-forritasafnið gerir okkur kleift að rýna í sérhvern díl fyrir sig. Þetta dæmi les gildislægsta bita rauðu rásarinnar og reynir að mynda bæti:

from PIL import Image

mynd = Image.open("mynd.png").convert("RGB")
bitar = "".join(str(r & 1) for r, g, b in mynd.getdata())

baeti = bytes(
    int(bitar[i : i + 8], 2)
    for i in range(0, len(bitar) - 7, 8)
)

# Í kennsludæminu lýkur skilaboðunum á núllbæti.
skilabod = baeti.split(b"\x00", 1)[0]
print(skilabod)

Hér er byggt á fjölmörgum forsendum:

  • að stuðst sé við hina rauðu litrás,
  • að rannsóknin hefjist við fyrsta díl myndarinnar,
  • að bitarnir séu rýndir í þessari tilteknu röð,
  • að átta bitar skipi hvert bæti frá vinstri talið,
  • að núllbætið (e. null byte) gefi til kynna lok skilaboðanna.

Vísbendingar gagnaglímunnar verða að renna stoðum undir þessar forsendur, að öðrum kosti skulum við láta reyna á nokkrar kerfisbundnar útfærslur og færa þær til bókar.

Bitaplön

Í stað þess að einskorða rannsóknina við sjálfan lokabitann, reynist okkur unnt að varpa sérhverju bitasæti fram sem sjálfstæðri svarthvítri mynd. Mynd af því tagi nefnist iðulega bitaplan (e. bit plane).

Fyrir átta bita litgildi höfum við plan 0 til 7:

plan 7: gildishæsti bitinn — sá sem mestu ræður um útlit myndarinnar
...
plan 0: gildislægsti bitinn — sá sem síst hefur áhrif á sjónræna myndina

Falin teikning eða texti getur orðið greinilegur í plani 0 eða 1 þótt venjulega myndin líti eðlilega út.

Veftól eins og StegOnline geta sýnt litrásir og bitaplön. Vinsamlegast gætið þess að deila síst persónulegum eða viðkvæmum myndum með utanaðkomandi aðilum; látið ykkur nægja að styðjast við gögn úr gagnaglímum sem óhætt telst að miðla.

Sérhæfð verkfæri

zsteg

Verkfærið zsteg annast skipulega leit að kunnuglegum bitamynstrum innan PNG- og BMP-skráa:

zsteg mynd.png

Viðamikil eftirleit:

zsteg -a mynd.png

Stillingin -a getur hæglega skilað talsverðu suði og tilviljunarkenndum textabrotum. Við skulum því beina sjónum okkar að niðurstöðum sem:

  • falla að vísbendingum verkefnisins,
  • hýsa trúverðug skráarauðkenni,
  • mynda samfelldan texta eða gilt skráarsnið,
  • reynast unnt að endurtaka með nákvæmri tilgreiningu á zsteg-stillingum.

steghide

Verkfærið steghide býður upp á þann möguleika að hylja gögn innan tiltekinna JPEG-, BMP-, WAV- og AU-skráa.

Upplýsingar:

steghide info mynd.jpg

Útdráttur með lykilorði sem verkefnið gefur:

steghide extract -sf mynd.jpg -p eldfjall

Við skulum rita hin útdregnu gögn í viðeigandi verkefnismöppu og rýna í þau með file-skipuninni löngu áður en freistað er opnunar.

Aperi’Solve og StegOnline

  • Aperi’Solve keyrir mörg greiningartól og sýnir rásir.
  • StegOnline reynist okkur giftudrjúgt við rannsóknir á litrásum, bitoplönum og hversdagslegum útdrætti gagna.

Þessi verkfæri reynast vissulega vel til þess að vísa veginn, en vönduð úrlausn okkar verður ætíð að gera grein fyrir því hvaða niðurstaða það var sem máli skipti og hvaða rök hvíldu þar að baki.

Varað er við því að upphleðsla feli í sér miðlun gagna

Með því að hlaða myndskrá í vefverkfæri, erum við í raun að miðla henni til utanaðkomandi aðila. Látið ykkur því nægja að sýsla með tilbúin verkefnisgögn sem heimilt telst að berist út fyrir tölvukerfið.

Verkfærafrálag er ekki sjálfkrafa fáni

Víð leit getur fundið orð eins og:

pass
key
PNG
admin

innan um tilviljunarkennd bæti. Okkur ber að færa sönnur á frambjóðandann með því að:

  1. endurtaka nákvæmlega sjálfan útdráttinn,
  2. rýna í bætaröð eða sjálft skráarauðkennið,
  3. vitja innihaldsins með viðeigandi verkfæri,
  4. leggja mat á það með hliðsjón af lýsingu og fánasniði,
  5. kanna hvort niðurstaðan vísi okkur með eðlilegum hætti að næsta gagnasviði.

Æfing: hvaða niðurstöðu treystum við?

Æfing 4

zsteg -a mynd.png sýnir 200 línur. Þrjár þeirra eru:

b1,r,lsb,xy  .. text: "key"
b1,b,lsb,xy  .. file: Zip archive data
b3,g,msb,yx  .. text: "Aq!9"

Verkefnalýsingin kveður á um að „hið bláa gagnasvið hýsi tiltekinn pakka“. Hver af niðurstöðunum skyldi fyrst verða fyrir valinu hjá okkur?

Lausn við æfingu 4

Við skulum rýna í:

b1,b,lsb,xy .. file: Zip archive data

Rökin fyrir því eru þessi:

  • b gefa hina bláu litrás til kynna,
  • lýsingin minnist sérstaklega á blátt gagnasvið,
  • heitið „pakki“ kann hæglega að vísa til kippuskrár,
  • ZIP-sniðið býr yfir auðþekkjanlegri innri gerð sem okkur er fært að sannreyna.

Við skulum skera frambjóðandann út með nákvæmri tilgreiningu stillinga, beita file-skipuninni og í kjölfarið nýta unzip -t eða unzip -l. Hnitmiðað orðið key gæti sömuleiðis verið dæmi um hreinustu tilviljun.

Myndstærðir og hnökrar í skráarhausum

Skráarhaus myndar hýsir iðulega upplýsingar um breidd, hæð og aðra veigamikla þætti. Innan ramma gagnaglímunnar getur höfundur hæglega gripið til þess að:

  • tilgreina ranga hæð svo neðri hluti myndarinnar hvíli í leynd,
  • valda skemmdum á einu staku bæti í sjálfu skráarauðkenninu,
  • skeyta viðbótargögnum aftan við sjálft endamerkið,
  • nýta sér framandi litategund eða hljóðrás.

Við byrjum á:

file mynd.png
magick identify mynd.png
pngcheck -v mynd.png

Reynist skráarhausinn gallaður, skulum við einvörðungu gera breytingar á nýju afriti og færa nákvæmlega til bókar hvaða bæti það var sem tók breytingum. Við skulum forðast að láta reyna á handahófskenndar stærðir í þeirri von einni að fáni birtist, nema því aðeins að verkefnið færi okkur skýra vísbendingu þar um.

Lokaverkefni: mynd sem hvíslar

Æfing 5

Verkefnið segir:

Augað megnar síst af öllu að nema allt. Blámi, gagnsæi og síðast en engan veginn síst.

Skipunin file færir okkur sönnur á gilda RGBA PNG-mynd. Rýni í exiftool leiðir engar athyglisverðar athugasemdir í ljós, auk þess sem engin viðbótargögn á ZIP-formi láta á sér kræla.

Ritið niður rökstutta og skipulega greiningaráætlun.

Möguleg lausn við æfingu 5
  1. Varðveita óhreyft afrit og einskorða vinnuna við sérstaka niðurstöðumöppu.
  2. Einangra hina bláu litrás, enda minnist lýsingin sérstaklega á bláma:
magick mynd.png -channel B -separate nidurstodur/bla.png
  1. Rýna í alfa-rásina, þar sem tilvísunin í „gagnsæi“ telst vera skýr vísbending:
magick mynd.png -alpha extract nidurstodur/alfa.png
  1. Rannsaka RGB-gildi fyllilega gegnsærra díla með tilstyrk Pillow-safnsins, reynist hversdagslegur rásaaðskilnaður síst skila árangri.
  2. Rýna í gildislægsta bita hinnar bláu litrásar, þar sem orðalagið „síðast en engan veginn síst“ gæti hæglega vísað til hins svokallaða gildislægsta bita (e. least significant bit).
  3. Láta reyna á markvissa leit með zsteg í hinni bláu litrás og í LSB-röð, fremur en að hrapa að ályktunum byggðum á tilviljunarkenndum textabrotum.
  4. Færa sönnur á hin útdregnu gögn með hliðsjón af file-skipuninni, skráarauðkennum eða hinu tilskilda fánasniði.

Greiningaráætlunin snýr orðalagi lýsingarinnar yfir á þrjár prófanlegar tilgátur: bláa litrás, gagnsæi alfa-rásar og sjálfan gildislægsta bitann.

Samantekt

Í þessum kafla lærðum við að:

  • launritun hlutast til um að dylja sjálfa tilvist upplýsinganna á meðan dulritun beinist að því að hylja merkingu þeirra,
  • ríkt er lagt upp úr því að hversdagsleg lýsigögn og viðbótargögn hljóti forgang löngu áður en lagt er í viðameiri bitaleit,
  • RGB- og alfa-rásir geta hæglega varpað fram gerólíkum mynstrum,
  • díll sem telst gegnsær getur engu að síður hýst tiltekin RGB-litagildi,
  • gildislægsti bitinn hróflar síst við sjónrænum lit myndarinnar en getur þó hýst einn stakan gagnabita,
  • bitaplön búa yfir þeim eiginleika að gera sérhvert bitasæti sýnilegt rannsakandanum,
  • verkfæri á borð við zsteg, steghide, StegOnline og Aperi’Solve teljast til hjálpartóla en síst til staðgengla fyrir vandaða staðfestingu gagna,
  • skráarhausar mynda og stærðartilgreiningar þeirra geta verið gallaðar af ásettu ráði,
  • við skulum ætíð nýta vísbendingar verkefnisins við val á litrás, bitaröð og viðeigandi verkfærum,
  • okkur ber að forðast að miðla viðkvæmum myndskrám til utanaðkomandi vefþjónustna.

Í eftirfarandi kafla munum við kveðja myndskrárnar og beina sjónum okkar að hljóði: þar munum við fjalla um bylgjuform, tíðni, rófsrit (e. spectrograms), DTMF-tóna og Morse-merki.