Par exemple pour le C on doit écrire un main. Est ce que c'est la même chose avec l'assembleur ?
Ca dépend. Si tu utilises gcc pour l'édition de liens, tu as effectivement intérêt à exporter un symbole "main". Si tu utilises ld, c'est _start qu'il te faudra exporter (comme sur le lien fourni par Xioth).
Dans les deux cas tu as forcément un point d'entrée par lequel ton binaire commencera. Avec gcc tu auras également un _start, qui se contentera d'appeler main() par lui-même, avec les arguments qui vont bien (argc, **argv, **env...).
Voici un Hello World à la printf, c'est-à-dire sans passer par les syscalls, et en liant notre code avec la libc, donc :
% cat helloworld_libc.asm
bits 32
extern printf
section .data
format db 'Hello world!', 10, 0
section .text
global main
main:
push ebp
mov ebp, esp
sub esp, 4
mov dword [esp], format
call printf
xor eax, eax
leave
ret
% nasm -f elf helloworld_libc.asm
% gcc -o helloworld_libc helloworld_libc.o -m32
% ./helloworld_libc
Hello world!
C'est comme ça que tu écriras tes shellcodes, si tu décides de les faire toi-même !
