[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
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 ?
RE: [NASM] Bot irc basique - Trivial - 11-05-2013
Salut Ark.
Oui, ça serai plutôt simpa Je compte sur toi pour recevoir ça 
The game, Trivial.
RE: [NASM] Bot irc basique - fr0g - 11-05-2013
Nice
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 
(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é 
The game, Trivial
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
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 
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 .
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 (et nomdelastruct_size pour avoir sa taille )
|