NewbieContest

Divers => Cracking => Discussion démarrée par: Best Comp Iraq le 06 Juin 2014 à 13:21:43



Titre: ASM et Linux
Posté par: Best Comp Iraq le 06 Juin 2014 à 13:21:43
Hello les NewbieContestiens,

Dans l'espoir d'avancer sur les épreuves de wargame je me suis dit qu'il était bon d'avoir des bonnes notions d'assembleur. J'aimerais bien pour ça pouvoir coder des petits scripts de test. Je suis sous Linux et j'ai installé nasm. Maintenant je n'arrive pas à trouver sur Google quel est le code source de base qui doit être implémenté. Par exemple pour le C on doit écrire un main. Est ce que c'est la même chose avec l'assembleur ?

EDIT : j'ai vu que gcc -S test.c me traduisait test.c en assembleur. Seulement ce n'est pas la même manière de représenter les données que sous Ollydbg. Connaissez-vous un moyen d'y remédier ?


Titre: Re : ASM et Linux
Posté par: Xioth le 06 Juin 2014 à 14:24:15
Salut,

Moi j'ai utilisé ce tuto pour apprendre : http://www.tutorialspoint.com/assembly_programming/index.htm
Je l'ai trouvé plutôt pas mal. Je pense que t'auras ce que tu cherches de-dans.

Bye.


Titre: Re : ASM et Linux
Posté par: Ge0 le 06 Juin 2014 à 14:57:36
Citation
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 :

Code:
% 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 ! :)


Titre: Re : ASM et Linux
Posté par: Best Comp Iraq le 07 Juin 2014 à 12:59:05
C'est normal que cela ne ressemble pas totalement à ce qu'il a sur Ollydbg ?


Titre: Re : ASM et Linux
Posté par: benjani13 le 07 Juin 2014 à 13:22:16
Quelle différence?

Il y a une différence entre un programme complet (que tu écris et assemble), et un programme que tu décompile.

Dans le cas d'un programme que tu écris tu as principalement deux syntaxes : Intel et AT&T (Intel étant celle que tu vois sous OllyDBG, AT&T la syntaxe par défaut sous Linux). Tu as as aussi d'autres syntaxes dérivées suivant l'assembleur que tu utilises (NASM, MASM, TASM).

Dans le cas de la décompilation, suivant l'outil tu n'aura pas forcément les instructions "d'initialisation" comme les section, db, global, etc (probablement car tu ne regardes que le segment de code) et le code ne sera pas forcément exactement le même car tous les outils ne donnent pas forcément la même représentation.

Et pour finir, sache que tous ça n'est valable que pour une architecture donnée! Un processeur x86 n'a pas le même langage d’assemblage (car pas le même jeu d'instruction) qu'un processeur ARM ou qu'un processeur Motorala.