HAKATEMIA
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:

FormaattiKäyttö
-f elf64Linux x86-64 objektitiedosto
-f elf32Linux x86 (32-bit) objektitiedosto
-f macho64macOS x86-64
-f win64Windows x64
-f binraaka 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-viittaukset global-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_bin

Ero 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_bin
1 / 2
Hakatemia Pro

Hakkeroinnin oppiminen alkaa tästä

Sadat interaktiiviset kurssit, virtuaalilabrat ja CTF-haasteet selaimessasi. Aloita ilmainen kokeilu ilman korttitietoja.