Переполнение буфера - печать хоста / имени пользователя - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь выполнить атаку переполнения буфера на простую программу на C, чтобы получить немного знаний о том, как она работает.До сих пор у меня был скрипт на python, который имеет кучу \ x90s и адрес возврата, который указывает на один из слотов адреса, который содержит часть салазок NOP.У меня есть код, который печатает имя хоста, но он не написан мной, и я не понимаю сам код.

У меня была идея, что я мог бы написать программу C, которая печатает имя хоста с uname -a, которыйЯ мог бы разобрать сборку и затем перевести это в шестнадцатеричное, но это дает мне много кода сборки.Это дало бы мне больше знаний о том, что на самом деле происходит, но с выходом в отношении я чувствую, что я делаю что-то не так.просто напечатать имя моего хоста? Я работаю на 32-битной системе Kali Linux.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Вы можете просто использовать простой шелл-код / ​​bin / sh и запустить любую команду, какую захотите.Вот простой шеллкод для этого.Если вам все еще нужна только эта команда, вы можете изменить командную строку, вставленную в шелл-код (uname -a вместо /bin/sh).

0 голосов
/ 11 декабря 2018

Вам не нужно писать всю программу на C, а затем разбирать ее.

Вы можете написать простую функцию C, которая делает только то, что вам нужно, и затем попросить GCC скомпилировать, но нет собрать и связать его, используя параметр -S.

Вы также можете включить флаг отладки -g, чтобы сборка имела некоторые данные отладки, которые облегчат чтение.

Взять этот пример кода:

#include <unistd.h>

void get_hostname() {
    char buffer[100];
    gethostname(buffer, 100);
}

Если это полное содержимое файла hn.c, вы можете использовать следующую команду для создания файла hn.asm:

gcc -S -g hn.c -o hn.asm

В этом файле все еще будет куча вещей, которые вам не нужны, но также будет легко найти и очистить сборку нужной вам функции:

.Ltext0:
    .globl  get_hostname
    .type   get_hostname, @function
get_hostname:
.LFB0:
    .file 1 "hn.c"
    .loc 1 3 0
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    subq    $112, %rsp
    .loc 1 3 0
    movq    %fs:40, %rax
    movq    %rax, -8(%rbp)
    xorl    %eax, %eax
    .loc 1 5 0
    leaq    -112(%rbp), %rax
    movl    $100, %esi
    movq    %rax, %rdi
    call    gethostname
    .loc 1 6 0
    movq    -8(%rbp), %rax
    xorq    %fs:40, %rax
    je  .L2
    call    __stack_chk_fail
.L2:
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc

Вы можете передать это ассемблеру всгенерируйте требуемый машинный код.

Обратите внимание на директивы .loc: они используются для сопоставления кода сборки с номером строки исходного кода C.Вы можете использовать их так же, как отладчик, чтобы узнать, какие сборочные строки представляют какую строку кода C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...