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:
| Tiedosto | Sisältö |
|---|---|
printlib.inc | jaettu makro print_buf (write-syscall + parametrit) |
strlen.asm | stub-funktio my_strlen: palauttaa nyt heti 0 |
main.asm | kutsuu 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 retstrlen-algoritmi
NUL-päättyvälle merkkijonolle:
- RAX = laskuri, alustetaan 0:ksi.
- Lue tavu osoitteesta
[rdi + rax](rdi = string-pointteri, rax = offset). - Jos tavu on 0 (NUL), poistu: RAX pitää sisällään pituuden.
- Muuten
inc raxja 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 retHuomaa: 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_strlenelää omassastrlen.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ä%includeja%definekapseloivat 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.