Как перенаправить в другое место с помощью GDB? - PullRequest
0 голосов
/ 04 сентября 2018

В основном у меня есть:

#include <stdio.h>

int main(int argc, char *argv[])
{
    char buf[100];
    strcpy(buf, argv[1]);
    printf("Buf congains: %s\n", buf);
    return 0;
}

Насколько я отлаживал это, вот что происходит:

выполнение оболочки:

run `perl -e 'print "A"x100'`
  1. Копировать argv[1] в $ rbp
  2. после выполнения strcpy() скопировать argv [1] из $ rbp в $rsp/buf
  3. печать данных из $ rsp

Печать стека в точке останова на линии printf()

Breakpoint 1, main (argc=2, argv=0x7fffffffebd8) at main.c:7                                                         
7           printf("Buf congains: %s\n", buf);                                                                       
(gdb) x/50x $rsp                                                                                                     
0x7fffffffea70: 0xffffebd8      0x00007fff      0x00400372      0x00000002                                           
0x7fffffffea80: 0x41414141      0x41414141      0x41414141      0x41414141                                           
0x7fffffffea90: 0x41414141      0x41414141      0x41414141      0x41414141                                           
0x7fffffffeaa0: 0x41414141      0x41414141      0x41414141      0x41414141                                           
0x7fffffffeab0: 0x41414141      0x41414141      0x41414141      0x41414141                                           
0x7fffffffeac0: 0x41414141      0x41414141      0x41414141      0x41414141                                           
0x7fffffffead0: 0x41414141      0x41414141      0x41414141      0x41414141                                           
0x7fffffffeae0: 0x41414141      0x00007f00      0x79529b00      0x7349452f                                           
0x7fffffffeaf0: 0x00000000      0x00000000      0xf7a35ec5      0x00007fff                                           
0x7fffffffeb00: 0x00000000      0x00000000      0xffffebd8      0x00007fff                                           
0x7fffffffeb10: 0x00000000      0x00000002      0x004005f6      0x00000000                                           
0x7fffffffeb20: 0x00000000      0x00000000      0xd23fb797      0xacdf42c3                                           
0x7fffffffeb30: 0x00400500      0x00000000

Вопрос: По сути, я хочу изменить данные из другой ячейки памяти и указать buf в этом месте.

например, измените 0x7fffffffeb20 в $ rsp, используя set {char[5]}0x7fffffffeb20 = "BCDE", а затем установите для данных 0x7fffffffeab0 значение 0x7fffffffeb20, поэтому, когда $ rip выполняет адрес 0x7fffffffeab0, он должен указывать на чтение дополнительных данных из 0x7fffffffeb20.

Заранее спасибо:)

1 Ответ

0 голосов
/ 04 сентября 2018

buf не является переменной, поэтому вы не можете изменить ее динамически. Если вы хотите изменить адрес, добавьте переменную-указатель.

#include <stdio.h>

int main(int argc, char *argv[])
{
    char buf[100];
    char *bufp = buf;
    strcpy(buf, argv[1]);
    printf("Buf contains: %s\n", bufp);
    return 0;
}

Затем вы можете изменить значение bufp после strcpy(), и оно будет использовать это.

(gdb) set variable bufp = 0x7fffffffeb20;

Кстати, вы вызываете переполнение буфера вашими 100 А. buf[100] имеет место только для 100 символов, но вам нужно buf[101], чтобы оставить место для 100 букв и завершающего нулевого байта. Таким образом, strcpy() приводит к неопределенному поведению.

Если вы изучаете переполнение буфера и шелл-код, это может быть преднамеренным, но в противном случае вы должны это исправить.

...