В основном у меня есть:
#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'`
- Копировать
argv[1]
в $ rbp
- после выполнения
strcpy()
скопировать argv [1] из $ rbp в $rsp/buf
- печать данных из $ 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
.
Заранее спасибо:)