Käänteistekniikan perusteet
Soveltakaa virheenjäljitys- ja disassembly-taitojanne yksinkertaisten binääritiedostojen analysointiin, funktioiden tunnistamiseen ja ohjelmalogiikan ymmärtämiseen ilman lähdekoodia.
Käänteistekniikan perusteet on ilmainen Assembly-kieli ja x86-tason järjestelmäohjelmointi-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Assembly-kieli ja x86-tason järjestelmäohjelmointi-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Assembly-kieli ja x86-tason järjestelmäohjelmointi-kurssilla on yhteensä 4 oppituntia.
Mitä käänteismallinnus on?
Käänteismallinnus (RE) on prosessi, jossa ohjelmistoa analysoidaan sen sisäisen toiminnan ymmärtämiseksi ilman pääsyä alkuperäiseen lähdekoodiin. Voitte ajatella sitä ohjelmien parissa työskentelevänä salapoliisina!
Siinä otetaan käännetty ohjelma eli binääritiedosto ja selvitetään takaperin, mitä se tekee, miten se tekee sen ja joskus myös miksi.
RE-työkalupakkianne
Käänteismallinnuksessa käytätte pääasiassa kahdenlaisia työkaluja:
- Disassemblerit: Nämä työkalut muuntavat konekoodin eli ohjelman raakamuotoiset tavut takaisin ihmiselle luettavaksi assemblykieleksi. Tunnettuja esimerkkejä ovat
objdump, IDA Pro ja Ghidra. Ne ovat "silmänne" ohjelman käskyihin. - Virheenkorjaimet: GDB:n (GNU Debugger) kaltaisten työkalujen avulla voitte suorittaa ohjelmaa askel kerrallaan, keskeyttää sen suorituksen ja tarkastella rekisterien ja muistin sisältöä missä tahansa vaiheessa. Ne ovat "kätenne" käynnissä olevan ohjelman käsittelyssä.
Tutustuminen kohdeohjelmaan
Tässä oppitunnissa analysoimme yksinkertaista x86-assemblyohjelmaa. Kuvitelkaa, että käytössänne on vain sen käännetty versio ja että teidän on selvitettävä sen logiikka!
Ohjelma simuloi yksinkertaista "salasanan tarkistusta" vertaamalla kahta kovakoodattua arvoa ja tulostamalla tuloksen perusteella viestin.
section .data
msg_access db "Access granted!", 0xA
len_access equ $ - msg_access
msg_denied db "Access denied.", 0xA
len_denied equ $ - msg_denied
section .text
global _start
_start:
; Simulate checking a "password" value
mov eax, 1234 ; Our "secret" password value
mov ebx, 5678 ; A "user-provided" value
cmp eax, ebx ; Compare secret with user input
je .access_granted ; If equal, jump to access granted
.access_denied:
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, msg_denied
mov edx, len_denied
int 0x80
jmp .exit
.access_granted:
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, msg_access
mov edx, len_access
int 0x80
.exit:
mov eax, 1 ; sys_exit
mov ebx, 0 ; Exit code 0
int 0x80Kääntäminen ja disassembly
Ensin kääntäisimme assemblyohjelmamme suoritettavaksi tiedostoksi. Linuxissa tämä tehdään yleensä assemblerilla, kuten NASM:lla, ja linkkerillä, kuten LD:llä.
nasm -f elf32 program.asm -o program.old -m elf_i386 program.o -o program
Sen jälkeen käytämme objdump-työkalun kaltaista disassembleria nähdäksemme, kuinka konekoodi muunnetaan takaisin assemblyksi:
objdump -d program
Tässä on esimerkki siitä, mitä saatatte nähdä:
08048060 <_start>:
8048060: b8 d2 04 00 00 mov $0x4d2,%eax
8048065: bb 36 16 00 00 mov $0x1636,%ebx
804806a: 39 d8 cmp %ebx,%eax
804806c: 74 1c je 804808a <.access_granted>
Sisääntulopisteiden tunnistaminen
Käänteismallinnuksessa yksi ensimmäisistä etsittävistä asioista on ohjelman sisääntulopiste. Siitä suoritus alkaa.
Assemblysta käännettyjen Linux-suoritettavien tiedostojen sisääntulopisteen nimi on usein _start. Disassembly-tulosteessamme näette osoitteessa 08048060 tunnisteen <_start>.
Tämä kertoo täsmälleen, mistä osoitteesta suoritin alkaa suorittaa käskyjä, kun ohjelma ladataan.
Ohjelman suorituspolun ja hyppyjen jäljittäminen
Ymmärtääksenne ohjelman logiikan teidän on jäljitettävä sen suorituspolkua. Ehdolliset hyppykäskyt ovat keskeisiä päätöksenteon, kuten if/else-lauseiden, ymmärtämisessä.
Esimerkissämme näemme käskyjen eax ja ebx vertailun cmp %ebx,%eax avulla, minkä jälkeen seuraa je 804808a <.access_granted>.
cmp: Vertailee kahta arvoa ja asettaa suorittimen liput.je(Jump if Equal): Jos vertailun tulos oli yhtäsuuruus, suoritus siirtyy osoitteeseen0804808aeli.access_granted-lohkoon.- Jos arvot eivät ole yhtä suuret, suoritus jatkuu järjestyksessä seuraavaan käskyyn eli
.access_denied-lohkoon.
Järjestelmäkutsujen ymmärtäminen
Ohjelmat ovat vuorovaikutuksessa käyttöjärjestelmän kanssa järjestelmäkutsujen välityksellä. Linuxin x86-ympäristössä (32-bittinen) nämä kutsutaan yleensä int 0x80 -käskyllä.
Ennen int 0x80 -käskyä tiettyihin rekistereihin ladataan arvoja:
eax: Sisältää järjestelmäkutsun numeron, esimerkiksi4kutsullesys_writeja1kutsullesys_exit.ebx, ecx, edx: Sisältävät järjestelmäkutsun argumentit, kuten tiedostotunnisteen, puskurin osoitteen ja pituuden kutsullesys_write.
Tarkastelemalla näitä malleja voitte tunnistaa toimintoja, kuten konsoliin kirjoittamisen tai ohjelman lopettamisen.
Merkkijonojen ja datan poimiminen
Viestit ja muu staattinen data tallennetaan binääritiedoston dataosioihin. Voitte usein tarkastella niitä komennoilla objdump -s -j .data program tai objdump -s -j .rodata program.
Assemblyssä näette käskyjä, jotka lataavat näiden merkkijonojen osoitteen rekisteriin, esimerkiksi mov ecx, 0x8049080, jossa 0x8049080 osoittaa merkkijonoon.
Esimerkissämme viestit "Access granted!" ja "Access denied." löytyisivät .data-osiosta, ja niiden osoitteet välitettäisiin kutsulle sys_write.
Alkuperäisen logiikan rekonstruointi
Yhdistämällä kaikki nämä havainnot voimme rekonstruoida ohjelman alkuperäisen logiikan:
- Suoritus alkaa kohdasta
_start. - Ohjelma lataa kaksi tiettyä kokonaislukuarvoa rekistereihin
eaxjaebx. - Se vertailee näitä kahta arvoa.
- Jos arvot ovat yhtä suuret, suoritus siirtyy osioon, joka tulostaa konsoliin viestin "Access granted!".
- Jos arvot eivät ole yhtä suuret, suoritus jatkuu osioon, joka tulostaa konsoliin viestin "Access denied.".
- Tulostamisen jälkeen ohjelma päättyy hallitusti.
Tämä on käänteismallinnuksen ydin: ohjelman tarkoituksen ja toiminnan ymmärtäminen sen käännetystä muodosta.
Pikatesti
Tarkastellaan seuraavaa purettua x86-koodikatkelmaa. Oletetaan, että 0x402000 sisältää merkkijonon "Yes\n" ja 0x402008 sisältää merkkijonon "No\n".
0x401000: mov eax, 0x5
0x401005: mov ebx, 0x5
0x40100a: cmp eax, ebx
0x40100c: jne 0x401018
0x40100e: mov edi, 0x402000 ; "Yes\n"
0x401013: call 0x401040 <puts@plt>
0x401018: mov edi, 0x402008 ; "No\n"
0x40101d: call 0x401040 <puts@plt>
Oppitunnin yhteenveto
Tässä oppitunnissa opitte perustason käänteisen suunnittelun keskeiset tekniikat:
- Ymmärrätte, mitä RE tarkoittaa ja miksi se on tärkeää.
- Tunnistatte keskeiset työkalut, kuten purkajat (
objdump) ja virheenkorjaajat (GDB). - Löydätte ohjelman aloituskohdan (
_start). - Seuraatte ohjelman suorituksen kulkua ehdollisten hyppyjen avulla (
cmp,je). - Tunnistatte järjestelmäkutsut (
int 0x80) ja niiden parametrit. - Poimitte binääristä merkityksellisiä merkkijonoja ja tietoja.
Soveltamalla näitä tekniikoita voitte alkaa rekonstruoida ohjelmien logiikkaa ja toimintaa myös ilman niiden alkuperäistä lähdekoodia!
Opi Assembly tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 12
- Oppitunnit
- 48
Usein kysytyt kysymykset
Onko oppitunti ”Käänteistekniikan perusteet” ilmainen?
Kyllä – oppitunnin ”Käänteistekniikan perusteet” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Assembly-kieli ja x86-tason järjestelmäohjelmointi-kurssin, päivitä CoddyKit PROhon. Assembly-kieli ja x86-tason järjestelmäohjelmointi-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Käänteistekniikan perusteet”?
Soveltakaa virheenjäljitys- ja disassembly-taitojanne yksinkertaisten binääritiedostojen analysointiin, funktioiden tunnistamiseen ja ohjelmalogiikan ymmärtämiseen ilman lähdekoodia. Harjoittelet Assembly-kieli ja x86-tason järjestelmäohjelmointi-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Assembly-kieli ja x86-tason järjestelmäohjelmointi-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Assembly-kieli ja x86-tason järjestelmäohjelmointi-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”Käänteistekniikan perusteet”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Assembly-kieli ja x86-tason järjestelmäohjelmointi-oppitunnilla?
Kyllä. Jokainen Assembly-kieli ja x86-tason järjestelmäohjelmointi-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- GDB:n käyttö Assembly-virheenjäljityksessä
- Johdanto disassembly-työkaluihin
- Käänteistekniikan perusteet
- Dynaaminen analyysi jäljityksen ja hookien avulla