Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- BITS 64
- ;syscalls and arguments
- %assign clock_gettime 228
- %assign sysexit 60
- %assign syssetreuid 133
- %assign syswrite 1
- %assign sysread 0
- %assign sysclose 3
- %assign syssocket 41
- %assign sysconnect 42
- %assign sysnanosleep 35
- %assign CLOCK 0
- %assign STDOUT 1
- %assign SOCK_STREAM 1
- %assign AF_INET 2
- GLOBAL _start
- section .data
- login db "USER makhno", 10, 0
- badlogin db "USER 0xACAB", 10, 0
- section .bss
- response resb 256
- resplen resb 8
- SECTION .text
- _start:
- ;int 3
- ;mov r8, 0 ; we'll flip this at each new socket to determine which login to send
- xor r8, r8
- setreuid:
- xor rax, rax
- add al, syssetreuid
- xor rdi, rdi
- xor rsi, rsi
- syscall
- push rbp
- tcpsocket:
- ;create TCP socket
- xor rax, rax
- add al, syssocket
- xor rdi, rdi
- xor rsi, rsi
- xor rdx, rdx
- ;mov rdi, AF_INET
- mov dil, AF_INET
- ;mov rsi, SOCK_STREAM
- mov sil, SOCK_STREAM
- syscall
- cmp r8, 1
- je flip_off
- flip_on:
- inc r8
- jmp tcpconnect
- flip_off:
- dec r8
- tcpconnect:
- ;set up stack and store sockfd
- mov rbp, rsp
- ;sub rsp, 0x8
- sub spl, 0x8
- mov QWORD [rbp-0x8], rax
- ;int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- xor rax, rax
- push rax
- ;ip 192.168.1.8:21 + AF_INET
- mov rax, 0x0801a8c015000002
- push rax
- mov rdi, QWORD[rbp-0x8]
- mov rsi, rsp
- xor rdx, rdx
- ;mov rdx, 16
- mov dl, 16
- ;mov rax, sysconnect
- xor rax, rax
- mov al, sysconnect
- syscall
- xor rcx, rcx
- cmp rcx, rax
- jne exit
- ;connect: use r9 as connect (0) or post send (1)
- mov r9, 0
- tcpread:
- ;should be connected, try to read
- ;mov rax, sysread
- xor rax, rax
- mov rdi, QWORD [rbp-0x8]
- lea rsi, [response]
- ;mov rdx, 0x100
- xor rdx, rdx
- mov dx, 0x101
- dec dl
- syscall
- mov [resplen], rax
- mov rsp, rbp
- sub spl, 0x8
- xor rax, rax
- cmp rax, r9
- jne getendtime
- xor rax, rax
- ;mov rax, syswrite
- mov al, syswrite
- ;mov rdi, STDOUT
- xor rdi, rdi
- mov dil, STDOUT
- lea rsi, [response]
- mov rdx, [resplen]
- syscall
- mov rsp, rbp
- ;sub rsp, 0x8
- sub spl, 0x8
- ;int nanosleep(const struct timespec *req, struct timespec *rem)
- ;sleep for 1 secs, rem=null
- ;sub rsp, 0x50
- sub spl, 0x50
- xor rsi, rsi
- inc rsi
- mov [rbp-0x58], rsi
- dec rsi
- mov [rbp-0x50], rsi
- ;mov rax, sysnanosleep
- xor rax, rax
- mov al, sysnanosleep
- lea rdi, [rbp-0x58]
- syscall
- mov rsp, rbp
- ;sub rsp, 0x8
- sub spl, 0x8
- nop
- gettime:
- ;set up stack
- ;sub rsp, 0x40
- sub spl, 0x40
- ;mov rax, clock_gettime
- xor rax, rax
- mov al, clock_gettime
- ;mov rdi, CLOCK
- xor rdi, rdi
- lea rsi, [rbp-0x18]
- syscall ;get start time w/ real-time clock
- nop
- jmp tcpsend
- getendtime:
- ;mov rax, clock_gettime
- xor rax, rax
- mov al, clock_gettime
- ;mov rdi, CLOCK
- xor rdi, rdi
- lea rsi, [rbp-0x28]
- syscall ;get end time w/ real-time clock
- mov rdx, QWORD [rbp-0x28]
- mov rax, QWORD [rbp-0x18]
- mov rcx, rdx
- sub rcx, rax
- mov QWORD [rbp-0x30], rcx
- mov rdx, QWORD [rbp-0x20]
- mov rax, QWORD [rbp-0x10]
- mov rcx, rdx
- sub rcx, rax
- mov QWORD [rbp-0x30], rcx
- nop
- ;make it one number: multiply secs by 1,000,000,000, add result with nanosecs
- mov QWORD [rbp-0x38],1000000000
- cvtsi2sd xmm0,QWORD [rbp-0x38]
- cvtsi2sd xmm1,QWORD [rbp-0x40]
- mulsd xmm1,xmm0
- cvtsi2sd xmm0, QWORD [rbp-0x30]
- addsd xmm0, xmm1
- cvttsd2si rax, xmm0
- mov QWORD [rbp-0x48], rax
- nop
- make_printable_number:
- ;number should still be in rax...
- xor rbx, rbx
- xor rcx, rcx
- xor rdx, rdx
- push rbx ;0 byte null string
- ;mov rbx, 10 ; decimal divider
- mov bl, 10
- num_loop:
- idiv rbx
- ;add rdx, 0x30
- add dl, 0x30
- push dx
- inc rcx
- xor rdx, rdx
- cmp al, 0
- jne num_loop
- imul rcx, 2
- write_out:
- xor rax, rax
- ;mov rax, syswrite
- mov al, syswrite
- ;mov rdi, STDOUT
- xor rdi, rdi
- mov dil, STDOUT
- lea rsi, [rsp]
- mov rdx, rcx ; counter
- syscall
- ;print linefeed
- xor rax, rax
- mov al, 0x0a
- mov [rsp], rax
- ;mov rax, syswrite
- mov al, syswrite
- ;mov rdi, STDOUT
- xor rdi, rdi
- mov dil, STDOUT
- lea rsi, [rsp]
- ;mov rdx, 1 ; just one linefeed
- xor rdx, rdx
- add dl, 1
- syscall
- write_response:
- xor rax, rax
- ;mov rax, syswrite
- mov al, syswrite
- ;mov rdi, STDOUT
- xor rdi, rdi
- mov dil, STDOUT
- lea rsi, [response]
- mov rdx, [resplen]
- syscall
- tcpclose:
- ;mov rax, sysclose
- xor rax, rax
- mov al, sysclose
- mov rdi, [rbp-0x8]
- syscall
- mov rsp, rbp
- ;sleep a second
- ;mov rax, sysnanosleep
- xor rax, rax
- add al, sysnanosleep
- xor rsi, rsi
- lea rdi, [rbp-0x58]
- syscall
- ;jump back up and repeat
- jmp tcpsocket
- exit:
- xor rax, rax
- add al, sysexit
- xor rdi, rdi ; return code (0)
- syscall ; bye
- tcpsend:
- mov r9, 1
- ;mov rax, syswrite
- xor rax, rax
- inc al
- mov rdi, QWORD [rbp-0x8]
- cmp r8, 1
- je bad_login
- good_login:
- mov rsi, login
- jmp login_send
- bad_login:
- mov rsi, badlogin
- login_send:
- ;mov rdx, 12
- xor rdx, rdx
- mov dl, 12
- syscall
- jmp tcpread
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement