HAKATEMIA
24NASM käytännössä

Capstone: oma `strlen` ja write

Keskitaso30MIN

Capstone: oma strlen ja write

NASM-osion päätösharjoitus. Yhdistät kaiken: sektiot, makrot, %include, ulkoiset symbolit, write-syscall: ja kirjoitat ensimmäisen oman apufunktiosi.

Tehtävä

Kotihakemistossasi on kolme tiedostoa:

TiedostoSisältö
printlib.incjaettu makro print_buf (write-syscall + parametrit)
strlen.asmstub-funktio my_strlen: palauttaa nyt heti 0
main.asmkutsuu my_strlen lipulle, sitten print_buf, sitten exit

Build-skripti build.sh kääntää kaikki kolme objektiksi ja linkittää ld:lla. my_strlen:n stub on:

X86
1my_strlen:
2    xor     rax, rax            ; rax = 0 (laskuri)
3.loop:
4    ; TEHTÄVÄ: täytä silmukka.
5    ret                         ; KESKEN: palauttaa toistaiseksi 0
6.done:
7    ret

strlen-algoritmi

NUL-päättyvälle merkkijonolle:

  1. RAX = laskuri, alustetaan 0:ksi.
  2. Lue tavu osoitteesta [rdi + rax] (rdi = string-pointteri, rax = offset).
  3. Jos tavu on 0 (NUL), poistu: RAX pitää sisällään pituuden.
  4. Muuten inc rax ja jatka silmukkaa.

NASM-syntaksissa:

X86
1.loop:
2    cmp     byte [rdi + rax], 0
3    je      .done
4    inc     rax
5    jmp     .loop
6.done:
7    ret

Huomaa: byte-prefiksi on pakollinen. Ilman sitä NASM ei tiedä miten paljon dataa lukea: voiko olla 1, 2, 4 vai 8 tavua. byte pakottaa "yksi tavu kerrallaan".

TERMINALASCIINEMA

Miksi tämä on capstone

  • Sektiot: my_strlen elää omassa strlen.asm:ssä, .text-sektiossa. main.asm:n .data-sektio määrittelee lipun.
  • Symbolit: global my_strlen (strlen.asm:ssä) + extern my_strlen (main.asm:ssä) yhdistyvät linkitysvaiheessa.
  • Makrot + include: printlib.inc:ssä %include ja %define kapseloivat write-syscallin.
  • Kutsutapa: my_strlen:n sopimus on "RDI = pointteri sisään, RAX = pituus ulos": SysV AMD64.

Kun strlen toimii, koko ketju toimii: lippu näkyy stdoutissa.

1 / 2
Hakatemia Pro

Hakkeroinnin oppiminen alkaa tästä

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