Robin Niinemets

Cybersecurity Student

Helsinki, Finland

×

H4-Kääntöpaikka

Date: 14-11-2024

Ympäristö:


OS: Debian GNU/Linux 12 "Bookworm"

Browser: Firefox 128.3.1esr (64-bit)

Hardware Model: innotek Gmhb VirtualBox

Memory: 5.7 GiB

Prosessor: AMD Ryzen 9 3900X - 6 cores used

Disk: 21.5 GB

Network: NAT

a) Asenna Ghidra.

Ensiksi piti asentaa jdr ja jdk. Ne toteutuivat komennoilla sudo apt install default-jre ja sudo apt install default-jdk tämän jälkeen latasin ja unzippasin ghidra .zip tiedoston jonka jälkeen sen pystyi vain ajamaan ja ghidra lähti pyörimään.

Ghidra 11.1.2 on asennettu onnistuneesti.

(Hogan, Boucheron & Horcasitas, 2022)

rever-C. Käänteismallinna packd-binääri C-kielelle Ghidralla. Etsi pääohjelma. Anna muuttujielle kuvaavat nimet. Selitä ohjelman toiminta. Ratkaise tehtävä binääristä, ilman alkuperäistä lähdekoodia. ezbin-challenges.zip

Eli kun ghidra saatin auki, ensimmäisenä luodaan projekti, minne sitten importataan haluttu tiedosto. Tämän jälkeen päästään analysoimaan ohjelmaa. Ihan ekana symbol tree valikosta mä etsin functio hakemiston, ja sieltä main funktioo.

Tämä avasikin Decompile osion, jossa näkyi haluttu main funktioCkielellä. Siitä sitten lähdettiin muuttamaan muuttujia järkevän nimisiksi. Ja tunnilta muistinkin vielä että ensimmäisen int muuttujan voisi muuttaa input muuttujaksi. Tämä muuttuja siis on käyttäjän syöte.

Sitten char muuttujan mä nimesin password nimiseksi, sillä se on se syötetty tulos mitä verrataan itse oikeaan salasanaan. Tämä tuntui minulle loogisimmalta.

Yksinkertaisuudessaan ohjelma ihan ensimmäiseksi tulostaa stringin "Whats the password?" tämän jälkeen käyttäjä syöttää salasanan, minkä jälkeen Input muuttujassa strcmp() funktiossa käyttäjän syöttämä salasana ja oikea salasanaa verrataan toisiinsa. Tämän jälkeen if lause määrittää että mikäli tässä input muuttuja on sama kuin 0, tarkoittaa se että käyttäjä on syöttäny oikean salasanan. Strcmp() funktio siis yhdistää nämä kaksi stringiä, ja mikäli niissä on eroavia merkkejä, se kasvattaa ulostuloa =+1. Eli oikean salasanan ulostulo on 0 ja väärän 0 < x. Ja tämän logiikan mukaan tulostetaan jompi kumpi if lauseen vaihtoehdoista.

c) Jos väärinpäin. Muokkaa passtr-ohjelman binääriä (ilman alkuperäistä lähdekoodia) niin, että se hyväksyy kaikki salasanat paitsi oikean. Osoita testein, että ohjelma toimii. ezbin-challenges.zip

Seuraavaksi vuorossa oli muokata passtr ohjelman binääriä niin että ohjelma muuttaisi perjaattees if lauseen toisinpäin. Eli lähdin avaamaan main funktiota samalla tavalla kuin b) tehtävässä. Sen jälkeen Decompile ikkunassa mä klikkasin if muuttujaa, joka hyppäsi haluttuun kohtaan listening näkymässä. Päättelemällä ymmärsin että JNZ on ohje mitä assemblyn puolella pitää muuttaa, mutta en tienny, miten sen teen.

Googlasin siis ihan vain"assembly JNZ", mistä heti sainki vastauksen, mitä tämä ohje tekee. Eli tarkoittaa siis Jump-Not-Zero ja siinä samassa luki tän vastakohta, eli JZ mikä on Jump-Zero. Maalaisjärjellä siis päättelin, että tässä haluttiin kääntää kyseinen if lauseke väärinpäin, niin menin muuttamaan JNZ:n JZ:ksi. Käytännössä tämä onnistui Patch instruction toiminnolla jossa haluttua kenttää pystyttiin heti muuttamaan. Sitten muutettu ohjelmisto pitikin exportata. Tunnilla Teron vinkkiä noudattamalla ohjelman muotona pidettiin original file. Tässä ohjelmalle piti vielä antaa ajo oikeudet, jonka jälkeen testaamalla selvisi, että muutos oli onnistunut ja kaikki toimi halutulla tavalla. (Quora, 17.8.2024)

d) Nora CrackMe: Käännä binääreiksi Tindall 2023: NoraCodes / crackmes. Lue README.md: älä katso lähdekoodeja, ellet tarvitse niitä apupyöriksi. Näissä tehtävissä binäärejä käänteismallinnetaan. Binäärejä ei muokata, koska muutenhan jokaisen tehtävän ratkaisu olisi vaihtaa palautusarvoksi "return 0".

Tässä tehtävässä latasin githubista zip tiedoston, missä oli kaikki tarvittavat tehtävät kun tiedoston unzippasi. Lähdin liikkeelle lukemalla ohjeiden ohjeistamana README.md tiedoston jossa selvisi miten tiedostoja ajetaan ja ratkaistaan.

Eli ensikis lähdekoodit piti kääntää binääriksi make crackme01 komennolla niin saatiin käännettyy source binääriksi. Ja sama toimii jokaisen tiedoston kohdalla muuttamalla vain tiedostonimeä.

(NoraCodes, 2024)

e) Nora crackme01. Ratkaise binääri

Binääriä lähdin aluksi ratkaisemaan katsomalla file komennolla tiedoston rakennetta, siitä en saanut mitään sen enempää irti. Sitten kokeilin käyttää strings komentoa, mikä palauttikin jo heti halutun salasanan. Tätä en kuitenkaan huomannut ensimmäisellä kerralla, kun ajoin ohjelman vaan työnsin binäärin ghidraan, josta alunperin sain vastauksen tietää. Eli täysin vahingossa strings:in avulla selvisi salasana myös, vaikka ghidran kautta sain sen ensin tietää. Ja tosiaan salasana siis löytyy input muuttujan strncmp() funktion sisältä.

Sitten oli vuorossa crackme.01e. Lähdin täysin samalla ideologialla liikkeelle eli strings:iä käyttämällä. Ja siellä näkyi jo oletettava salasana heti. Se näytti kuitenkin vähän hassulta, nii avasin binäärin myös ghidrassa, ihan vaan varmistaakseen että kyse on salasanasta. Ja ghidrassa asia varmistui, eli oikea asia oli kyseessä. Sitten lähdin kokeilemaan salasanaa, mutta se ei onnistunut. Bash oli ihan sekasin eikä osannu tulkita "!" merkkiä. Kokeilin siis montaa eri asiaa, vaihtaa merkin hexa muotoon ja käyttää tupla hipsukoita mutta mikään ei toiminu, kunnes tajusin myös kokeille yksittäisiä hipsukoita.

Olen aina tottunut käyttämään tupla hipsukoita, niin en tullut heti ajatelleeksi, että kyse voisi olla tästä, mutta onneks oon törmänny eri yhteyksissä siihen että välillä yksittäiset ja tupla hipsukat eivät tarkoita samaa. Ja sieltä vastaus löytyikin. Hyvä harjoitus sinänsä, koska tämä on tulevaisuutta varten hyvä toimintatapa ottaa huomioon erikoismerkkien kanssa.

f) Nora crackme02. Nimeä pääohjelman muuttujat käänteismallinnetusta binääristä ja selitä ohjelman toiminta. Ratkaise binääri.

crackme02 olikin vähän isompi aivopähkinä. Eli kuten aikaisemmatkin tehtävät niin lähdin stringsillä, mikä paljasti salasanaksi "password1" mutta se ei kuitenkaan toiminut ja antoi väärää vastausta. Avasin binäärin sitten ghidrassa ja rupesin tuijottamaan Decompiler näkymää muutamien tuntien ajan. Yritin ymmärtää, miten ohjelma toimii.

Lähdin myös nimeämään muutujat kuvassa oleviin muotoihn, en tiiä onko ne oikein, mutta itselle ne tuntui loogiselta. Heti alusta asti tajusin että alkuperäistä salasanaa muutetaan XOR tehtävistä tutuks tulleen funktion tavoin. Toki tämä oli huomattavasti enemmän spagettia mulle, ja piti aika paljon käyttää päättelykykyä, että miten ohjelma voisi toimia. Ensimmäinen hypoteesi on että viimeistä integeriä muutetaan, mutta se osoittautui vain osittain oikeaksi.

Olin pitkään jumissa, kunnes päätin alkaa lukemaan tehtävien tekijän luomaa tutoriaalia (yritin välttää kuitenkin mahdollisimman paljon vastusten lukemista, ja napata vain vinkkejä) ja aika nopeasti heräsi ajatus, että ehkä ei vaan yhtä kirjainta yritetä muuttaa, vaan kaikkia kirjaimia muutetaan, esim. caesar cipher tyylisesti. Tästä ajatuksesta kun sain kiinni niin tehtävä ratkesi melko nopeasti tämän jälkeen.

(Tindall 2017)

Helpottaakseen tämän hahmottamista käytetään oikeita arvoja.

Comparison ='p'
controlNumber =1

Eli ohjelma vertaa linjalla 16 olevassa if lauseessa ASCII taulukossa olevan'p'arvoa -1 arvoon eli 'o' arvoon. Ja koska vertauksessa käytetään tätä 'p' arvoa, niin tästä syystä vastaukseksi käy moni eri vaihtoehto kuten vaikkao, o`r, o`rryms. eli ohjelma on hieman ongelmallinen. Oikea käännös tästä on kuitenkin o\`rrvnqc0. Ja myös tyhjä syöte toimii vastaukseksi, koska rivillä 15 oleva if lause skippaa kaikki tsekkaukset, koska syöte on tyjä ja palauttaa heti "\0" arvon, mikä siirtyy suoraan riville 23 ja palauttaa oikean vastauksen. ASCII salasanan siirrokseen mä käytin https://www.dcode.fr/ascii-shift-cipher työkalua.

g) Vapaaehtoinen: Ja sen yli. Crackme01 on useampia ratkaisuja. Montako löydät? Miksi?

En tiedä hetaanko tässä tätä, mutta yksi tapa minkä löysin on että, kunhan ollaan käytetty password1 niin sen jälkeen voi syöttää mitä tahansa merkkejä kuinka paljon vain. Eli se hyväksyy kaikki merkit oikeina password1 osan jälkeen. Tämän osan eteen ei mitään pystynyt syöttämään kuitenkaan, eli password1 pitää tulla ensimmäisenä.

h) Vapaaehtoinen: Pyytämättäkin. Crackme02 on kaksi ratkaisua. Löydätkö molemmat?

Eli yksi tapa saada syöte on decoodaamalla binääri ja käyttämällä ghidraa esimerkiksi. Toinen tapa on syöttämällä ohjelmalle vain tyhjä syöte, jolloin ohjelma palauttaa oikean vastauksen. Käytin molempia vastauksia i) kohdassa ja siinä molemmat toimivat.

i) Vapaaehtoinen, hieman haastavampi: A ray. Nora crackme02e. Ratkaise binääri.

Samoilla toimenpiteillä kun aikaisemmissa tehtävissä sain stringsistä tietää salasanan mikä ei tietenkään toiminut. Näin siis ghidra auki ja analyysiä. Koodi oli melkein identtinen aikaisempaan tehtävää, lukuun ottamatta niin sieltä oli helppo tunnistaa avainarvo mikä oli 'y' ja muunnos tällä kertaa on-2. Näillä tiedoilla lähdin kokeilemaan aikaisempia menetelmiä ja tyhjällä syötteellä löytyy oikea vastaus, sekä"w"syötteellä, mikä on siis'y'avaimesta-2ASCII taulukossa. En kuitenkaan meinannu millään löytää kokonaan oikeaa vastausta kunnes tajusin tätä vastausta kirjoittaessa että en tehnyt muutosta koko salasanalle, koska binäärikäännöksessä'y'puuttui muun salasanan edestä. Oikean vastauksen sai kuitenkin, kun muuttiyuvmnpoisanan-2käännöksellä ASCII taulukossa. Tämä tehtävä oli hauska, koska tämä oli tahallaan tehty hämääväksi, sillä ASCII käännöksestä sai monta erillaista"w"alkuista käännöstä ja myös, kun tässä vaiheessa alkoi jo olemaan aika hyvin ymmärrystä sekä osaamista niin tämä tuntui juuri sopivalta haasteelta.

x) katso ja tiivistä. Tiivistämiseen riittää muutama ranskalainen viiva. Hammond 2022: Ghidra for Reverse Engineering (PicoCTF 2022 #42 'bbbloat') (Video, noin 20 min)

- Video käsittelee joitakin perus menetelmiä, ennen ghidran käyttöä, kutenstringsjafile

- Hän ratkaisee videolla picoCTF haastetta, jonka se onnistuneesti ratkaisemaan.

- Videolla esitetään mielenkiintoisa lähestymistapoja. Asioita mihin kiinnittää huomiota ja joitakin menetelmiä mitä kannattaa aina testata, kun tehdään staattista analyysiä.

(Hammond, 2022)

Lähteet

1. Hogan, Boucheron & Horcasitas. 2022. How To Install Java with Apt on Debian 11. DigitalOcean. Luettavissa: https://www.digitalocean.com/community/tutorials/how-to-install-java-with-apt-on-debian-11 Luettu: 14-11-2024

2. Quora. 17.8.2024. What is the difference between the JZ and JNZ instructions in assembly language. Quora. Luettavissa: https://www.quora.com/What-is-the-difference-between-the-JZ-and-JNZ-instructions-in-assembly-language Luettu: 14-11-2024

3. Tero Karvinen. 2024. Ezbin Challenges. Tero Karvinen. Luettavissa: https://terokarvinen.com/loota/yctjx7/ezbin-challenges.zip Luettu: 14-11-2024

4. NoraCodes. 2024. An Intro to x86_64 Reverse Engineering. NoraCodes. Luettavissa: https://nora.codes/tutorial/an-intro-to-x86_64-reverse-engineering/ Luettu: 14-11-2024

5. NoraCodes. 2024. Crackmes. NoraCodes. Luettavissa: https://github.com/NoraCodes/crackmes?tab=readme-ov-file Luettu: 14-11-2024

6. Hammond, 2022. Ghidra for Reverse Engineering (PicoCTF 2022 #42 'bbbloat'). Youtube. Katsottavissa: https://www.youtube.com/watch?v=oTD_ki86c9I Katsottu: 14-11-2024