← Back to Application hacking and vulnerabilities
H3 No Strings Attached
h3 No Strings Attached
Tekijä: Aapo Tavio
Pohjana Tero Karvinen ja Lari Iso-Anttila 2026: Sovellusten hakkerointi ja haavoittuvuudet 2026 kevät, Application hacking - 2026 Spring - English ICI012AS3AE-3001 and Finnish ICI012AS3A-3003
Käytettävän ympäristön ominaisuudet
-
Host
-
Host PC: HP Laptop 15s-eq3xxx
-
OS: Ubuntu 24.04.3 LTS
-
Processor: AMD Ryzen™ 7 5825U with Radeon™ Graphics × 16
-
Memory: 16.0 GiB
-
NIC: Realtek Semiconductor Co., 802.11ax Wireless
-
Architecture: x86_64
-
Firmware version: F.20
-
Kernel Version: Linux 6.14.0-37-generic
-
-
Virtual Machine
-
OS: Kali GNU/Linux Rolling
-
Release: 2025.4
-
Kernel Version: Linux 6.18.5+kali-amd64
-
Architecture: x86-64
-
Hardware Vendor: Qemu
-
Hardware Model: Standard PC _Q35 + ICH9, 2009_
-
Hardware Version: pc-q35-8.2
-
Firmware Version: 1.16.3-debian-1.16.3-2
-
Firmware Date: 2014-04-01
-
a) Strings. Download ezbin-challenges.zip. Run ‘passtr’. Find the correct password using ‘strings’. Also find the flag. (Preferably without looking at the source, if you can.)
29.1.2026 Klo 14.57
Latasin ensimmäiseksi zip-tiedoston, jonka jälkeen purin sen. Tämän jälkeen ajoin ohjelman “passtr”.

Kuva 1. Passtr ajaminen hakemistossa challenges
Ohjelma kysyi salasanaa ajettaessa. Koitin salasanaa “admin”, joka ei ollut oikein.

Kuva 2. Ohjelma kokonaisuudessaan toistaiseksi
Lähdin hakemaan strings ohjelman avulla salasanaa binääristä hakemistossa /home/aapo/Desktop/challenges/passtr. Komentona
$ strings passtr | less #putkitin lessiin koska tavaraa oli paljon
Taisin löytää heti salasanan ja lipun.

Kuva 3. Oletettu salasana oli sala-hakkeri-321
Menin kokeilemaan onnistuuko tuolla salasanalla. Oikea oli.

Kuva 4. Salasanalla sala-hakkeri-321 sai oikean vastauksen
b) Make a new version of the passtr.c program where the password doesn’t appear directly as-is in the binary. Demonstrate with a test that the password doesn’t appear. (Obfuscation is sufficient.)
29.1.2026 Klo 19.39
Aloin etsimään tietoa, miten voisin obfuskoida tiedoston. Netissä mainittiin ohjelmasta UPX, joten ajattelin sen olevan varmaan itselleni sopiva.
(Stack Exchange Inc. URL: obfuscation - Obfuscating C-based binaries to avoid decompilation - Stack Overflow)
UPX perustuu UCL datan kompressointi algoritmiin. Ohjelma on ilmainen ja lähdekoodi on avoin.
(Wikipedia. URL: UPX - Wikipedia)
C-ohjelmointikieli oli minulle sen verran vieras, että minun piti katsoa tietoa, miten C:n koodia ajetaan. Näköjään se pitää muuttaa kokoajalla (compiler) ensiksi binääriksi, jonka jälkeen sen voi ajaa.
(Stack Exchange Inc. URL: How do I execute a .c file? - Stack Overflow)
UPX ajetaan binääritiedostolle komentorivin virallisen manuaalin mukaan, joten minun pitää ensiksi siis koota lähdekoodi.
(Komento: man upx)
Kokosin lähdekoodin komennolla
$ gcc passtr.c -o passtr-uusi #gcc on compiler ohjelma, passtr.c on c-ohjelmointikielellä tehty ohjelma, -o valinta ja passtr-uusi määrittää uuden binääritiedoston nimen
(-o valinnan lähteenä gcc:n virallinen manuaali komentorivikehotteella. Komento: man gcc)
Katsoin vielä stringsillä, että näkyihän uudessa binäärissäkin samalla tavalla salasana ja lippu.

Kuva 5. Uudessa binäärissä näkyi samat tiedot
Sitten oli vuorossa upx:n käyttö.

Kuva 6. Upx ohjelmalla uuden binääritiedoston pakkaus
Sain piilotettua osan koodista, mutta mielestäni vieläkin näkyi liikaa tietoja.

Kuva 7. Ohjelma paketoituna upx:llä ja avattuna stringsillä
Näin upx:n GitHubin sivuilla maininnan, jonka mukaan valintojen –best ja –brute käyttäminen saavuttaisi parhaimman lopputuloksen.
(Oberhumer, Molnar & Reiser. URL: GitHub - upx/upx: UPX - the Ultimate Packer for eXecutables)
Ajoin nykyisen tiedoston päälle vielä upx:n komennolla
$ upx --best passtr-uusi

Kuva 8. Upx:n ajaminen valinnalla –best ja lopputulos
Avasin stringsillä taas binäärin.

Kuva 9. Samanlainen tuloste tuli ulos kuin aiemmin
Valinta –best ei siis muuttanut mitään tiedostossa. Toki upx:llä paketoitu versio oli parempi kuin ilman paketoimista, mutta salasanakin on mielestäni liian helposti arvattavissa. Tietysti jos salasana olisi erilainen tai merkkijonon “What’s the password?” muuttaisi johonkin toiseen muotoon, voisi tilanne olla taas paljonkin erilainen.
c) Packd. Run ‘packd’ from the package ezbin-challenges.zip. What is the password? What is the flag? (This task is slightly more challenging. Write down the approaches you tried and hypotheses you came up with. Hopefully you’ll reach the goal yourself, but if not, the walkthrough will be revealed in class…)
30.1.2026 Klo 10.36
Lähdin ensiksi ajamaan ohjelman. Ohjelma oli samalla kaavalla toimiva kuin passtr ohjelma.

Kuva 10. Packd ohjelma kysyi myös salasanaa
Avasin stringsillä ohjelman.

Kuva 11. Packd ohjelmassa viitteitä salasanasta ja lipusta
Koska minulla oli vain binääritiedosto hallussa, lähdin etsimään tietoa netistä, miten voisin saada ohjelman selkokieliseksi. Löysin artikkelin, jonka mukaan Ghidra nimisellä ohjelmalla voisi saada tietoa binääristä käänteismallinnuksella.
(Khaishagi 2024. URL: Ghidra Tutorial: Introduction)
Katsoin Kalin sivuilta, että ghidran taitaa saada suoraan aptin repositoriosta, joten annoin komennot
$ sudo apt-get update #Päivittää paikallisen listan saatavilla olevista paketeista
$ sudo apt-get install ghidra #Asentaa ghidran apt-repositoriosta
Ghidra
30.1.2026 Klo 11.05
Katsoin aiemmin mainitsemastani artikkelista (Khaishagi 2024) ohjeita ghidran käyttöön. Ensimmäiseksi avasin Ghidran ja tein uuden projektin kohdasta File > New Project. Valitsin kohdan “Non-Shared Project” ja projektin hakemistoksi /home/aapo, ts. kotihakemistoni.
Toin packd-ohjelman projektiini ja avasin sen koodiselaimella (Code Browser). Seuraavaksi Ghidra kysyi, haluanko analysoida packd:n, johon vastasin kyllä.

Kuva 12. Ghidran tuloste ohjelman analysoimisesta
Minulla oli kaikki oletusvalinnat seuraavassa ikkunassa valittuna. Tämän jälkeen sivuni näytti alla olevan kuvan mukaiselta.

Kuva 13. Packd koodiselaimessa analysoituna
Löysin kohdan, jossa luki jotain salasanasta.

Kuva 14. Salasana tai sen osa näkyi Ghidrassa
Kuitenkin kohdassa näkyi yhtä paljon salasanasta, kuin aikaisemmin stringsinkin kanssa.
Kokeilin salasanaa “piilos-An”, mutta se oli väärä.

Kuva 15. Ghidrassa ja stringsissä näkyvä salasana ei ollut oikea
30.1.2026 Klo 12.28
Klikkailin erilaisia kohtia Ghidran koodiselaimessa ja katsoin muutaman videon aiheesta.
(Hammond 2022. URL: GHIDRA for Reverse Engineering - YouTube)
(cyberryan 2025. URL: Reverse Engineering Made EASY with Ghidra! | Beginner Tutorial - YouTube)
Löysin koodista tekstin, josta sain viitteitä, että ohjelma olisi pakattu upx:llä.

Kuva 16. Assembly kohdassa olevaa tekstiä
Ajattelin, että pystyisinköhän deobfuskoimaan binäärin upx:llä.
30.1.2026 Klo 13.01
Purin upx paketin -d valinnalla.

Kuva 17. Tuloste oli ainakin lupaavan näköinen pakettia purettaessa
Tämän jälkeen näkyikin jo stringsillä helposti erilaista tietoa kuin aiemmin.

Kuva 18. Uusia tietoja stringsillä avatessa
Kokeilin tämän johdosta salasanaa “piilos-AnAnAs”, joka oli oikea.

Kuva 19. Oikealla salasanalla tulostui lippu
d) Optional bonus: Cryptopals. Crypto Challenge Set 1. This can be done as a bonus over several weeks. If you solve items 1 .. “4. Detect single-character XOR”, you’ve already stepped into the world of cryptography.
1. Convert hex to base64
30.1.2026 Klo 16.42
Lähdin tekemään tehtävää ja ensimmäiseksi huomasin sivun alalaidassa olevan maininta, jonka mukaan aina pitäisi käsitellä raaka tavuja. Tehtävänannossa oli hexa merkkijono ja base64 merkkijono (Cryptopals. URL: Challenge 1 Set 1 - The Cryptopals Crypto Challenges).
Lähdin selvittelemään asiaa ja ChatGPT antoi mielestäni selkeimmän vastauksen. Tai oikeastaan ainoan, josta sain selvää.
Selvitin raakatavujen, hexojen, binäärien ja base64 suhdetta toisiinsa syötteellä “tell me relation of raw bytes, hex, binaries and base64”.
(ChatGPT. Kielimalli: GPT-5.2)
Vastauksessaan tekoäly sanoi raakatavujen olevan alinta ja “oikeaa” dataa. Tämän jälkeen tulivat binääri, jonka kantaluku on 2. Heksojen kantaluku on 16 ja base64 kantaluku on 64. Tein vastauksesta piirustuksen ja liitin sen tähän. Ehkä voi jotain toistakin joskus auttaa hahmottamisessa.

Kuva 20. Sama arvo esitetty neljässä eri muodossa
Lisäksi kysyin “what is 0x in raw bytes”. Tekoäly vastasi sen olevan vain helpottamaan raakatavun tulkintaa ihmiselle. Etuliitteestä 0x näkee, että kyseessä on raakatavu.
Kysyin vielä kolmannen kysymyksen, joka oli “how can i convert raw bytes to base64”. ChatGPT vastasi, että minun oli muutettava ensin heksat binääriksi, jonka jälkeen ne olisi jaoteltava kuuden bitin paloiksi, koska base64 ottaisi binäärit tässä muodossa. Lisäksi AI kertoi linuxilla olevan xxd niminen ohjelma, jolla voisi kääntää raakatavut, ja heksat, base64-muotoon.
Löysin lisää ohjeita xxd-ohjelmasta.
(Stack Exchange Inc. URL: encoding - How can I convert from hex to base64? - Super User)
Sain ainakin suoraan heksoista base64 merkkijonon, joka oli tehtävänannossakin.

Kuva 21. Heksat käännetty base64-muotoon
Valinta -r tarkoittaa käänteistä (revert), eli hexat käännetään binääriksi. Valinta -p puolestaan tarkoittaa “plain” tekstiä.
(xxd virallinen manuaali Kali Linuxilla. Komento: man xxd)
En löytänyt oikein tietoa, miten saisin käännettyä raakatavut base64-muotoon. Ajattelin ehkä tajunneeni asian vain väärin. Sinänsähän hexat, joita käsittelin, olivat raakatavuja. Merkkijono olisi pitänyt vain tavuttaa kahden heksan osiin ja lisätä 0x eteen. Ehkä tämä oli tapa, jolla tehtävä kuuluikin tehdä.
Lähteet
ChatGPT. Kielimalli: GPT-5.2. Syöte: how can i convert raw bytes to base64. Generoitu: 30.1.2026.
ChatGPT. Kielimalli: GPT-5.2. Syöte: tell me relation of raw bytes, hex, binaries and base64. Generoitu: 30.1.2026.
ChatGPT. Kielimalli: GPT-5.2. Syöte: what is 0x in raw bytes. Generoitu: 30.1.2026.
Cryptopals. Convert hex to base64. Luettavissa: Challenge 1 Set 1 - The Cryptopals Crypto Challenges. Luettu: 30.1.2026.
Cyberryan 31.8.2025. YouTube. Reverse Engineering Made EASY with Ghidra! | Beginner Tutorial. Katsottavissa: Reverse Engineering Made EASY with Ghidra! | Beginner Tutorial. Katsottu: 30.1.2026.
Gcc ohjelman virallinen manuaali komentorivikehotteella. Linux Kali. Komento: man gcc. Luettu: 29.1.2026.
Hammond, J. 27.4.2022. YouTube. GHIDRA for Reverse Engineering (PicoCTF 2022 #42 ‘bbbloat’). Katsottavissa: GHIDRA for Reverse Engineering - YouTube. Katsottu: 30.1.2026.
Khaishagi, Z. 2.1.2024. Ghidra Tutorial: Introduction. Luettavissa: Ghidra Tutorial: Introduction. Luettu: 30.1.2026.
Oberhumer, Molnar & Reiser. upx. Luettavissa: GitHub - upx/upx: UPX - the Ultimate Packer for eXecutables. Luettu: 29.1.2026.
Stack Exchange Inc. How can I convert from hex to base64?. Luettavissa: encoding - How can I convert from hex to base64? - Super User. Luettu: 30.1.2026.
Stack Exchange Inc. How do I execute a .c file?. Luettavissa: How do I execute a .c file?. Luettu: 29.1.2026.
Stack Exchange Inc. Obfuscating C-based binaries to avoid decompilation. Luettavissa: obfuscation - Obfuscating C-based binaries to avoid decompilation - Stack Overflow. Luettu: 29.1.2026.
UPX virallinen manuaali komentorivikehotteella. Linux Kali. Komento: man upx. Luettu: 29.1.2026.
Wikipedia 24.1.2026. UPX. Luettavissa: UPX - Wikipedia. Luettu: 29.1.2026.
Xxd virallinen manuaali. Kali Linux. Komento: man xxd. Luettu: 30.1.2026.
Tätä dokumenttia saa kopioida ja muokata GNU General Public License (versio 3 tai uudempi) mukaisesti. http://www.gnu.org/licenses/gpl.html