N-PN White-Hat Project
[NASM] Bot irc basique - Version imprimable

+- N-PN White-Hat Project (https://dev.n-pn.fr/forum)
+-- Forum : Programmation (https://dev.n-pn.fr/forum/forumdisplay.php?fid=72)
+--- Forum : Langages compilés (https://dev.n-pn.fr/forum/forumdisplay.php?fid=25)
+--- Sujet : [NASM] Bot irc basique (/showthread.php?tid=2985)



[NASM] Bot irc basique - Darmo - 10-05-2013

Bonsoir!

Après une semaine à bouffer de l'asm, moi et Trivial avons enfin fini de coder notre bot irc en NASM.

Bon ok il est très basique, il ne fait que lire en brut les messages renvoyés par le serveur auquel on est connecté (irc.big-daddy.fr) et du channel.

Code :
BITS    32

EXTERN  puts
EXTERN  printf
EXTERN  send
EXTERN  recv
      
SECTION .data
        sock_error      db      "[-] Echec de creation de la socket", 0
        sock_ok         db      "[+] Creation de la socket", 0
        connect_error   db      "[-] Echec de la connection au serveur", 0
        connect_ok      db      "[+] Connection au serveur irc.big-daddy.fr", 0
        nick_cmd        db      "NICK BotDe7Lieu", 0xd, 0xa, 0
        user_cmd        db      "USER BotDe7Lieu 0 0 :BotDe7Lieu", 0xd, 0xa, 0
        input_print     db      "\ninput: %s", 0
        channel         db      "JOIN #Secu-appli", 0xd, 0xa, 0
SECTION .bss
        buffer          resb    256
SECTION .text
        GLOBAL  main
main:
        push    ebp
        mov     ebp, esp
make_socket:                    ; _
        push    0               ;  |
        push    0x1             ;  | struct sockaddr_in
        push    0x2             ; _|
        mov     ecx, esp        ; on passe le début de la struct en arg
        mov     ebx, 1          ; syscall socket
        mov     eax, 102        ; syscall sys_socketcall
        int     0x80
        mov     esi, eax        ; file descriptor du socket
        cmp     eax, 0
        jb      sock_fail       ; if (eax < 0) on jmp à sock fail
        push    sock_ok
        call    puts
connect:
        push    0
        push    dword 0xC589BF58 ; irc.big-daddy.fr
        push    dword 0x0B1A0002 ; port: 6667
        mov     ecx, esp         ; ecx = début de la structure
        push    0x10            
        push    ecx
        push    esi
        mov     ecx, esp
        mov     ebx, 3          ; 3 = sys_connect
        mov     eax, 102        ; sys_socketcall
        int     0x80
        test    eax, eax      
        jnz     connect_fail    ; si la connection a échoué
        push    connect_ok
        call    printf
send_:
        push    0               ; int flags
        push    17              ; size_t len
        push    nick_cmd        ; *buf
        push    esi             ; sockfd
        call    send
        push    0               ; int flags
        push    33              ; size_t len
        push    user_cmd        ; *buf
        push    esi             ; sockfd
        call    send
receive:
        push    0               ; int flags
        push    256             ; size_t len
        push    buffer          ; *buf
        push    esi             ; fd du socket
        call    recv
        push    buffer
        call    puts
        push    0
        push    256
        push    buffer
        push    esi
        call    recv
        push    buffer
        call    puts
join:
        push    0               ; flags
        push    18              ; length
        push    channel         ; nom du chan
        push    esi             ; fd du socket
        call    send
        jmp     receive
        leave
        ret
sock_fail:    
        push    sock_error
        call    puts
        leave
        ret
connect_fail:
        push    connect_error
        call    puts
        leave
        ret

Toutes critiques / remarques ou commentaires sont les bienvenus évidemment Wink


RE: [NASM] Bot irc basique - ark - 11-05-2013

Cool du code assembleur!
Tiens, ca vous dis je vous fait la version 64 bits demain ? Big Grin


RE: [NASM] Bot irc basique - Trivial - 11-05-2013

Salut Ark.
Oui, ça serai plutôt simpa Smile Je compte sur toi pour recevoir ça Smile

The game, Trivial.


RE: [NASM] Bot irc basique - fr0g - 11-05-2013

Nice Wink


RE: [NASM] Bot irc basique - b0fh - 11-05-2013

Très impressionnant, sauf que votre bot ne répond pas aux messages PING, il ne pourra donc pas rester connecté bien longtemps (et sur certains serveurs, il ne se connectera pas du tout).

Mais quitte a faire ce genre de trucs, faites-le jusqu'au bout: appeler la libc en externe c'est de la triche, faites tous les syscalls a la main.

Et sinon, gcc -S, ça va bien aussi.


RE: [NASM] Bot irc basique - Trivial - 11-05-2013

(11-05-2013, 01h05)b0fh a écrit : Très impressionnant, sauf que votre bot ne répond pas aux messages PING, il ne pourra donc pas rester connecté bien longtemps (et sur certains serveurs, il ne se connectera pas du tout).

Exact, disons qu'on a arrête de coder le bot, dès qu'il s'est connecté au CHAN en question.
A vrai dire, on a 2 autres projet à réaliser (Un keylogger en C), ainsi qu'un Snake en C++.
Je vais faire ça dans la soirée Smile

(11-05-2013, 01h05)b0fh a écrit : Mais quitte a faire ce genre de trucs, faites-le jusqu'au bout: appeler la libc en externe c'est de la triche, faites tous les syscalls a la main.

Et sinon, gcc -S, ça va bien aussi.

Oui, tu as tous à fais raison. Disons que grace à ce projet, j'ai appris beaucoup de chose en Assembleur. Je suis déjà fier de ce projet, même si ce n'est pas grand chose.

Et pour ce qui est de gcc -S, crois moi que j'en ai mangé Big Grin

The game, Trivial Smile


RE: [NASM] Bot irc basique - sakiir - 11-05-2013

Bien joué les gars ! désolé pour mon absence on refait un truc du genre vite Smile


RE: [NASM] Bot irc basique - ark - 13-05-2013

Yo, bon, j'ai toujours pas fini la versions 64 bit, je me heurte en effet a un petit problème que je ne comprends pas...
Il s'agit d'un problème de passage de paramètres a la fonction connect().

Voici ce que me print un strace du binaire:
Code :
connect(3, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("0.0.0.0")}, 16) = -1 ECONNREFUSED (Connection refused)

On peux voir que le port et l'ip sont tous les deux a 0, ca me gene un peu ^^

voila le code (ampute de certaines parties):
Code ASM :

BITS 64

    EXTERN  puts
    EXTERN  htons

    %DEFINE BUFF_SIZE   1024
    %DEFINE INT_SIZE    4
    %DEFINE AF_INET     2
    %DEFINE SOCK_STREAM 1

    %DEFINE SYS_SOCKET  41
    %DEFINE SYS_CONNECT 42
    %DEFINE SYS_CLOSE   3
    %DEFINE SYS_WRITE   1

    SECTION .rodata
            sock_error      db      "[-] Error while creating socket", 0
            sock_ok         db      "[+] The socket have been successfuly created", 0
            connect_error   db      "[-] Error: connexion to server failed", 0
            connect_ok      db      "[+] Connecting to irc.n-pn.fr", 0
            nick_cmd        db      "NICK asm64_bot", 0xd, 0xa, 0
            user_cmd        db      "USER BotDe7Lieu 0 0 :BotDe7Lieu", 0xd, 0xa, 0
            input_print     db      "\ninput: %s", 0
            channel         db      "JOIN #bot", 0xd, 0xa, 0
        server      db  "irc.n-pn.fr", 0
    SECTION .bss
            buffer          resb    1024
        sock_fd     resb    4

    SECTION .text

        GLOBAL  main
main:
        push rbp
        mov rbp, rsp
;; make_socket
            mov     rdi, AF_INET
            mov     rsi, SOCK_STREAM
        mov rdx, 0
            mov     rax, SYS_SOCKET
            syscall         ; Syscall socket()
            mov     [sock_fd], eax  ; Saving socket fd
            cmp     rax, 0
            jl      sock_fail
        mov     rdi, sock_ok
            call    puts
;; connect
        xor     rdi, rdi
        mov     edi, DWORD [sock_fd]
        xor     rax, rax
        push    server
        push    QWORD 0x0b1a0000
        push    AF_INET
        mov rsi, rsp
        mov rdx, 0x10       ; sizeof struct sockaddr ; Don't know how to have a generic value here...
        mov     rax, SYS_CONNECT
        syscall
        cmp rax, 0
        jl  connect_fail
        mov rdi, connect_ok
        call    puts

        call    close_socket
        mov     rax, 0
        leave
        ret

sock_fail:
        mov     rdi, sock_error
        call    puts
        mov     rax, 1
            leave
            ret

connect_fail:
        mov rdi, connect_error
        call    puts
        call    close_socket
        mov     rax, 1
        leave
        ret

close_socket:                   ; This just closes the socket
        push    rbp
        mov rbp, rsp
        xor rdi, rdi
        mov     edi, DWORD [sock_fd]
        mov     rax, SYS_CLOSE
        syscall
        leave
        ret
 


Voili voilou, donc si quelqu'un a une idee de pourquoi, je veux bien savoir! ^^


RE: [NASM] Bot irc basique - gruik - 13-05-2013

bon du coup t'as timeout sur irc donc je post ici Big Grin

comme dit tu fais un connect() qui prend en paramètre une IP (dword/32) et tu lui files le pointeur sur "irc.n-pn.fr", entre les deux il manque un gethostbyname() ou au moins l'IP hardcodée du serveur (ex: 0x0100007f == 127.0.0.1)

d'autre part tu fais un push QWORD 0x0b1a0000, c'est pas bon du tout, le port est un unsigned short (netinet/in.h) donc il faut mettre push word 0x0b1a à la place
et idem pour le push AF_INET qui suit, sin_family est défini sur 16bits donc push word AF_INET dans la structure, pour ce qui est de sa taille ca ne change pas entre 32/64, ca fait bien 16 octets, hardcodé ça marche très bien


RE: [NASM] Bot irc basique - ark - 14-05-2013

Okay, donc j'ai un peu avancer, on a le droit a un bot qui se co/deco instant! \o/ Magnifique. x) le seul probleme etant que j'ai hardcoded pas mal de trucs.

Voici le code pour l'instant, je compte virer mes trucs trop hardcoded et les remplacer par des trucs plus generiques. Et une fois que ca sera fait, je rajouterais la reponse au ping.

Code ASM :
BITS 64

    EXTERN  puts

    %DEFINE BUFF_SIZE   1024
    %DEFINE INT_SIZE    4
    %DEFINE AF_INET     2
    %DEFINE SOCK_STREAM 1

    %DEFINE SYS_SOCKET  41
    %DEFINE SYS_CONNECT 42
    %DEFINE SYS_CLOSE   3
    %DEFINE SYS_WRITE   1

    SECTION .rodata
            sock_error      db      "[-] Error while creating socket", 0
            sock_ok         db      "[+] The socket have been successfuly created", 0
            connect_error   db      "[-] Error: connexion to server failed", 0
            connect_ok      db      "[+] Connecting to irc.n-pn.fr", 0
            nick_cmd        db      "NICK asm64_bot", 0xd, 0xa, 0
            user_cmd        db      "USER BotDe7Lieu 0 0 :BotDe7Lieu", 0xd, 0xa, 0
            input_print     db      "\ninput: %s", 0
            channel         db      "JOIN #bot", 0xd, 0xa, 0
        server      db  "localhost", 0
    SECTION .bss
            buffer          resb    1024
        sock_fd     resb    4

    SECTION .text

        GLOBAL  main
main:
        push rbp
        mov rbp, rsp
;; make_socket
            mov     rdi, AF_INET
            mov     rsi, SOCK_STREAM
        mov rdx, 0
            mov     rax, SYS_SOCKET
            syscall         ; Syscall socket()
            mov     [sock_fd], eax  ; Saving socket fd
            cmp     rax, 0
            jl      sock_fail
        mov     rdi, sock_ok
            call    puts
;; connect
        xor     rax, rax
        push    rax             ; padding
        push    DWORD 0xc589bf58     ; Hardcoded server's IP
        push    WORD 0x0b1a
        push    WORD AF_INET
        mov rsi, rsp
        xor     rdi, rdi
        mov     edi, DWORD [sock_fd]
        mov rdx, 0x10
        mov     rax, SYS_CONNECT
        syscall
        cmp rax, 0
        jl  connect_fail
        mov rdi, connect_ok
        call    puts

;; send data identification
        xor rdi, rdi
        mov edi, [sock_fd]
        mov rsi, nick_cmd
        mov rdx, 16
        mov     rax, 1
        syscall
        xor rdi, rdi
        mov edi, [sock_fd]
        mov rsi, user_cmd
        mov rdx, 33
        mov     rax, 1
        syscall

;; receive datas
        xor     rax, rax
        inc rax         ; set rax to 1 for the cmp
        jmp     recv_data_loop1
recv_data_start1:
        xor     rdi, rdi
        mov edi, [sock_fd]
        mov rsi, buffer
        mov rdx, 1024
        mov     rax, 0
        syscall             ; read what's on the socket 'till there's nothing left

        push    rax         ; save rax's value  which is read's return value
        mov rdi, 1
        mov rsi, buffer
        mov rdx, rax
        mov     rax, 1
        syscall             ; print the buffer to stdout
        pop rax

recv_data_loop1:
        cmp rax, 287            ; Hardcore cheat of the death hame:
        jne recv_data_start1

;; join chan
        xor rdi, rdi
        mov edi, [sock_fd]
        mov rsi, channel
        mov rdx, 11
        mov     rax, 1
        syscall

;; close connexion and exit
        call    close_socket
        mov     rax, 0
        leave
        ret

sock_fail:
        mov     rdi, sock_error
        call    puts
        mov     rax, 1
            leave
            ret

connect_fail:
        mov rdi, connect_error
        call    puts
        call    close_socket
        mov     rax, 1
        leave
        ret

close_socket:                   ; This just closes the socket
        push    rbp
        mov rbp, rsp
        xor rdi, rdi
        mov     edi, DWORD [sock_fd]
        mov     rax, SYS_CLOSE
        syscall
        leave
        ret
 



RE: [NASM] Bot irc basique - Trivial - 14-05-2013

Vraiment pas mal Ark \o/.
Dès que tu as finis, la meilleure solution, est d'éditer le Post de Darmo, histoire de foutre ton code Smile.

Trivial.


RE: [NASM] Bot irc basique - gruik - 14-05-2013

ben euh.. non, ça dépend ce que tu cherches, perso je trouve intéressant de voir l'historique des démarches/des pb rencontrés, voir d'où c'est parti et où ça arrive à la fin, sinon on perd la cohérence temporelle en lisant le 1er post qui finalement est le post final et ceux qui suivent n'ont plus aucun intérêt, on pourrait aussi bien les supprimer dans ce cas ?

sinon en terme de bonne idée un lien pastebin et/ou un lien pour télécharger directement, voir le code un peu mieux ou autre, pourquoi pas...


RE: [NASM] Bot irc basique - supersnail - 14-05-2013

Sinon pour ce qui est des structures, ben la macro NASM "struc" is your friend Wink (et nomdelastruct_size pour avoir sa taille Wink)