在gdb中,如何将字符串写入内存?

Bal*_*nat 7 string gdb

使用gdb将内联或十六进制写入内存地址非常简单:

(gdb) set {int}0x08040000 = 42
(gdb) set {int}0x08040000 = 0xffffffff
Run Code Online (Sandbox Code Playgroud)

但是,如何以类似的简单方式将字符或整个字符串写入内存?现在我不得不求助于将字符串翻译成十六进制然后输入,这很费时间.

Fur*_*rge 11

假设您有以下程序:

int main(void){
    char[] person = "Bob";
    char[] p2 = "Alice";

    printf("Hello %s\n");
}
Run Code Online (Sandbox Code Playgroud)

使用GDB,您可以在main中设置断点,并通过以下方式更改此人的姓名:

(gdb) set main::person = { 'S', 'a', 'm', 0x00 }
Run Code Online (Sandbox Code Playgroud)

或更多的怀疑

(gdb) set main::person = "Sam"
Run Code Online (Sandbox Code Playgroud)

如果要直接设置内存使用:

set {char [4]} 0x08040000 = "Ace"
Run Code Online (Sandbox Code Playgroud)

我假设,因为你用gdb戳内存,你知道你正在做什么,所以你知道为字符串设置空字节等.请记住,如果你试图更改数组的值,你试着放入一个比最初分配的字符串更长的字符串,你很可能会破坏内存.(试图将main :: person设置为"Dilbert"的例子会导致问题


Pau*_*ien 9

使用 strcpy()

(gdb) p malloc(20)
$3 = (void *) 0x6ce81808
(gdb) p strcpy($3, "my string")
$4 = 1827149832
(gdb) x/s $3
0x6ce81808: "my string"
Run Code Online (Sandbox Code Playgroud)

  • 尽管这是一个很好的技巧,但 strcpy 不是 gdb 命令。当您由于某种原因无法访问 strcpy 时会发生什么(在逆转恶意软件时,这是一个有效的假设)。 (3认同)