如何使用GDB重定向到其他位置?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用GDB重定向到其他位置?相关的知识,希望对你有一定的参考价值。
基本上我有:
#include <stdio.h>
int main(int argc, char *argv[])
{
char buf[100];
strcpy(buf, argv[1]);
printf("Buf congains: %s
", buf);
return 0;
}
据我调试它,下面是发生的事情:
执行shell:
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
", 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
读取额外数据。
提前致谢 :)
答案
buf
不是变量,因此您无法动态更改它。如果您希望能够更改地址,请添加指针变量。
#include <stdio.h>
int main(int argc, char *argv[])
{
char buf[100];
char *bufp = buf;
strcpy(buf, argv[1]);
printf("Buf contains: %s
", bufp);
return 0;
}
然后你可以在bufp
之后更改strcpy()
的值,它会使用它。
(gdb) set variable bufp = 0x7fffffffeb20;
顺便说一句,你的100 A会导致缓冲区溢出。 buf[100]
只有100个字符的空间,但你需要buf[101]
为100个字母和尾随空字节留出空间。所以strcpy()
会导致不确定的行为。
如果您正在研究缓冲区溢出和shellcode,这可能是有意的,但否则您应该修复它。
以上是关于如何使用GDB重定向到其他位置?的主要内容,如果未能解决你的问题,请参考以下文章