Различное поведение GDB и прямого исполнения при попытке использовать ROP - PullRequest
0 голосов
/ 09 декабря 2018

В последнее время я изучаю некоторые понятия о 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 не одинаково.

1 Ответ

0 голосов
/ 10 декабря 2018

Проблема в том, что когда я использую этот шелл-код напрямую, я получаю ошибку сегментации, потому что системная функция успешно вызывается, но не с удобным аргументом "/bin/bash"...

IНе удалось найти способ проверить источник проблемы, потому что поведение на GDB и без GDB не одинаково.

Возможно, есть много небольших различий между запуском программы внутри и вне GDB.

Например, GDB имеет тенденцию вызывать программу по полному пути, то есть:

gdb a.out
(gdb) run
... invokes /full/path/to/a.out

Среда, такая как $_, также может быть другой.

Вам нужно будет немного более креативным, чтобы решить вашу проблему.Вы можете попытаться свести к минимуму различия (например, использовать /full/path/to/a.out при вызове программы вне GDB), или включить core dump, и spelunk в ядре, которое будет сгенерировано вне GDB, чтобы вы могли понять, где все отличается (итакже найдите расстояние, которое вы нашли под GDB - оно может быть изменено при работе вне GDB).

...