Я пытаюсь написать программу для переполнения буфера в ОС gnu/linux
В одной статье, посвящённой этой проблеме, нашла следующий способ:
[мусор]+[адрес инструкции jmp/call esp]+[шеллкод]
Дизассемблирование уязвимой программы не помогает.
Каким образом можно найти адрес инструкции jmp %esp в gnu/linux?
Ответ
по вот этой инструкции собрал бинарник на 32-битной системе (на 64-битной ошибка: Error: operand type mismatch for 'jmp', см. обновление ниже).
текст программы:
$ cat vuln.c
#include
// hard coded jmp *esp function ;-)
void jmpesp()
{
__asm__("jmp *%esp");
}
int main(int argc, char *argv[])
{
char buffer[100];
strcpy(buffer, argv[1]);
printf("buffer: [%s].
", buffer);
return 0;
}
сборка бинарника vuln
$ gcc vuln.c -o vuln -ggdb -fno-stack-protector -z execstack
а вот она, инструкция:
$ objdump -d vuln | grep 'ff e4'
804844f: ff e4 jmp *%esp
обновление
на 64-битной системе, видимо, вместо esp следует использовать rsp
__asm__("jmp *%rsp");
тогда сборка проходит удачно. и инструкция присутствует:
$ objdump -d vuln | grep 'ff e4'
40054a: ff e4 jmpq *%rsp
Комментариев нет:
Отправить комментарий