使用gdb将内联或十六进制写入内存地址非常简单:
(gdb) set {int}0x08040000 = 42
(gdb) set {int}0x08040000 = 0xffffffff
但是,如何以类似的简单方式将字符或整个字符串写入内存?现在我不得不求助于将字符串翻译成十六进制然后输入,这很费时间。
答案 0 :(得分:10)
假设您有以下计划:
int main(void){
char[] person = "Bob";
char[] p2 = "Alice";
printf("Hello %s\n");
}
使用GDB,您可以在main中设置断点,并通过以下方式更改此人的姓名:
(gdb) set main::person = { 'S', 'a', 'm', 0x00 }
或更隐蔽
(gdb) set main::person = "Sam"
如果要直接设置内存,请使用:
set {char [4]} 0x08040000 = "Ace"
我假设因为你用gdb戳内存你知道你在做什么,所以你知道为字符串设置空字节等。请记住,如果你试图更改数组的值和你试图输入一个比最初分配的字符串更长的字符串,你很可能会破坏你的内存。 (试图将main :: person设置为“Dilbert”的例子会导致问题
答案 1 :(得分:7)
使用strcpy()
(gdb) p malloc(20)
$3 = (void *) 0x6ce81808
(gdb) p strcpy($3, "my string")
$4 = 1827149832
(gdb) x/s $3
0x6ce81808: "my string"