В последнее время я изучаю некоторые понятия о ROP.
и при выполнении задания на некоторых веб-сайтах, которые предоставляют исходный код
#include <stdio.h>
#include <string.h>
int main (int argc, char ** argv){
char message[20];
if (argc != 2){
printf ("Usage: %s <message>\n", argv[0]);
return -1;
}
strcpy (message, argv[1]);
printf ("Your message: %s\n", message);
return 0;
}
, стек не является исполняемым, поэтому в основном я пытаюсьчтобы переопределить адрес возврата адресом системной функции libc, aslr не используется.
Я использую переменную окружения SHELL, я нашел адрес с помощью gdb.
расстояние между адресом сообщения и возвращениемадрес 32 байта.
, поэтому мой шелл-код выглядит следующим образом: 'a' rep32 + @ofSystem + '4byteJUNK' + @SHELL
Проблема заключается в том, что, когда я использую этот шелл-код напрямую, я получаю сегментациюошибка, потому что системная функция успешно вызывается, но не с удобным аргументом "/ bin / bash", который предоставляется переменной environement, она вызывается с другой непечатаемой строкой, но когда я использую gdb, я проверяю, соблюдаются ли соглашения о вызовах (argsпередаются в стек), и оболочка успешно вызывается с помощью строки apropiate "/ bin /bash ".
Я не смог найти способ проверить источник проблемы, потому что поведение на GDB и без GDB не одинаково.