21NASM käytännössä
Output-formaatit ja linkitys
Keskitaso20MIN
Output-formaatit ja linkitys
NASM:n -f-lippu valitsee kohdeformaatin. Sama lähde kääntyy eri formaatteihin eri konetyypeille tai eri linkkereille:
| Formaatti | Käyttö |
|---|---|
-f elf64 | Linux x86-64 objektitiedosto |
-f elf32 | Linux x86 (32-bit) objektitiedosto |
-f macho64 | macOS x86-64 |
-f win64 | Windows x64 |
-f bin | raaka binäari, ei mitään ELF-kuorta (bootloader / shellcode) |
Hakatemian Linux-laboissa käytät käytännössä aina -f elf64.
Linkitys: ld vs gcc
NASM tuottaa objektitiedoston (object file), ei ajettavaa binääriä. Tarvitset linkkerin (linker), joka:
- yhdistää useita
.o-tiedostoja yhdeksi binääriksi - ratkaisee
extern-viittauksetglobal-määritelmiin - merkitsee binäärin entry-pointin (mistä suoritus alkaa)
- generoi tarvittavat segmentit (
.text,.data, jne.)
Kaksi yleisintä reittiä:
BASH
1# Pelkkä ld: minimaalinen, ei libc:tä
2ld main.o printer.o -o my_bin
3
4# gcc-driveriin: käyttää libc:tä + C-startup-koodia
5gcc main.o printer.o -o my_binEro on iso. ld tuottaa vain mitä annoit; entry-point on oletuksena _start. gcc lisää crt1.o-startupin joka tekee mm. __libc_start_main-kutsun ja vaatii että binäärissa on main (ei _start).
TERMINALASCIINEMA
_start vs main
_start: minkä tahansa Linux-binäärin todellinen entry-point. Kun kernel käynnistää prosessin, suoritus alkaa täältä.main: korkean tason entry-point joka näkyy C-ohjelmoijalle. Sen kutsuu__libc_start_main(libc:n startup-koodi), joka itse on kutsuttu_start:sta.
Pure assembly + ld -> kirjoita _start, älä main. Linkitys gcc:hen tai libc:hen -> kirjoita main, anna libc:n hoitaa _start.
Pikakomennot
BASH
1nasm -f elf64 printer.asm -o printer.o
2nasm -f elf64 main.asm -o main.o
3ld main.o printer.o -o my_bin
4./my_bin1 / 2
Hakatemia Pro
Hakkeroinnin oppiminen alkaa tästä
Sadat interaktiiviset kurssit, virtuaalilabrat ja CTF-haasteet selaimessasi. Aloita ilmainen kokeilu ilman korttitietoja.