rendered paste body[bits 32]
%define sys_socketcall 102
%define server 0x77841955 ; irc.anomalous-security.org
%define port 0xb1a ; 6667
%define stdin 0
%define stdout 1
%define sys_connect 3
%define sys_read 3
%define sys_write 4
%define sys_select 142
%define maxlen 510
[section .data]
nick db "NICK testing",0x0A
user db 'USER test 0 0 :test',0x0A
channel db "JOIN #test",0x0A
[section .bss]
msg resb 510 ; irc messages are 510 + \r\n at most ///THIS ISN'T TRUE
fd resd 1
fdset resb 40
[section .text]
global _start
_start:
mov eax, sys_socketcall
push ebx ; ebx = 0
inc ebx
push ebx
mov dl, 0x02 ; edx = 2
push edx
mov ecx, esp
int 0x80
mov [fd], eax
connect:
mov ebx, sys_connect
mov eax, sys_socketcall
push dword server
push word port
push word 0x02
mov ecx, esp
push dword 0x10
push ecx ; sockaddr_in
push dword [fd]
mov ecx, esp
int 0x80
signin:
; mov ebx, [fd] ; this seems to do fuck all so I commented it out tgo
mov ecx, user
call write
mov ecx, nick
call write
mov ecx, channel
call write
whileone:
call set_fdset
select:
mov eax, sys_select
mov ebx, 0x0A ; number of fds to check
mov ecx, fdset ; read
xor edx, edx ; write
mov esi, edx ; error
push edx ; smaller than push dword 0x00
push dword 0x01 ; 1 second timeout
mov edi, esp
int 0x80
add esp, 0x08
test eax, eax ; timeout
je whileone
mov ecx, stdin
call fd_isset
jne readin ; test stdin for reading
mov ecx, [fd]
call fd_isset
je whileone ; test stdin for reading
readsock:
mov ebx, [fd]
mov ecx, msg
call read
mov edx, eax
mov ebx, stdout
mov ecx, msg
call writelen
jmp whileone ; before there was a retn here, which caused the segmentation fault
readin:
mov ebx, stdin
mov ecx, msg
call read
mov edx, eax
mov ebx, [fd]
mov ecx, msg
call writelen
retn
close:
mov ebx, [fd]
mov eax, 0x06
int 0x80
quit:
xor eax,eax
inc al
int 0x80
; expects ecx to point to string, ebx to file desc
; how much was written is in eax on retn
; ----- I completley re-wrote strlen and put it in the write procedure tgo. -----
write:
mov esi, ecx ; ecx = string address
xor edx, edx
strlen.loop:
inc edx
lodsb
cmp al, 0x0A
jne strlen.loop
mov eax, sys_write ; edx = stringth length
int 0x80
test eax, eax
jl close
retn
; writelen
; excepts ebx,ecx,edx to be set to their proper values
writelen:
mov eax, sys_write
int 0x80
test eax, eax
jl close
retn
; on call:
; ecx points to buffer to fill with what is read
; ebx to point to fd
read:
mov edx, maxlen
mov eax, sys_read
int 0x80
retn
; sets master fd_set of stdin and remote socket
set_fdset:
mov dword [fdset], 0x00 ; FD_ZERO
mov ecx, stdin
call fd_set
mov ecx, [fd]
call fd_set
retn
; takes number to set in ecx
; |= (1<<(n)))
fd_set:
xor ebx, ebx
inc ebx
shl ebx, cl
or [fdset], ebx
retn
; checks if the fd (ecx) is set in fdset
fd_isset:
bt [fdset], ecx
setb cl
test cl, cl
retn