如何使用GDB重定向到其他位置?

问题描述 投票:0回答:1

基本上我有:

#include <stdio.h>

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

据我调试它,下面是发生的事情:

执行shell:

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读取额外数据。

提前致谢 :)

c debugging gdb
1个回答
1
投票

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 A会导致缓冲区溢出。 buf[100]只有100个字符的空间,但你需要buf[101]为100个字母和尾随空字节留出空间。所以strcpy()会导致不确定的行为。

如果您正在研究缓冲区溢出和shellcode,这可能是有意的,但否则您应该修复它。

© www.soinside.com 2019 - 2024. All rights reserved.