【问题标题】:In gdb, how can I write a string to memory?在 gdb 中,如何将字符串写入内存?
【发布时间】:2013-10-30 10:46:39
【问题描述】:

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

(gdb) set {int}0x08040000 = 42
(gdb) set {int}0x08040000 = 0xffffffff

但是我怎样才能以同样简单的方式将字符或整个字符串写入内存呢?现在我不得不求助于将字符串翻译成十六进制然后输入,这很耗时。

【问题讨论】:

    标签: string gdb


    【解决方案1】:

    假设你有以下程序:

    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”的示例会导致问题

    【讨论】:

    • 也许我应该在这里补充一点,我需要这个用于学校的练习,我们必须使用反汇编代码和 gdb 来找出程序的作用,所以我没有可用的源代码。
    • 虽然保罗的回答更简单,而且大部分情况下更好,但我认为我的回答更正确。您正在调用 strcpy 来完成您的肮脏工作 - 99% 的时间都可以。但是如果你试图反转 strcpy 函数本身会发生什么?如果由于某种原因您无法访问 strcpy 怎么办?无论如何,我的最后一个示例都可以使用。
    【解决方案2】:

    使用strcpy()

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

    【讨论】:

    • 虽然这是一个不错的技巧,但 strcpy 不是 gdb 命令。当您由于某种原因无法访问 strcpy 时会发生什么(在逆转恶意软件时,这是一个有效的假设)。
    • 我不知道您可以定义自己的命令。说 set {char [4]} 0xDEADBEEF = "Sam" 然后编写自己的函数不是更容易吗?此外,除了 C/C++(Go、ADA、汇编等)之外,您还可以使用 gdb 进行调试,因此 strcpy 并不总是存在。
    • 我用你的答案来创建和分配一个字符串。被调试的程序是一个 glib 程序并在 g_free() 上崩溃,所以我不得不使用 g_malloc() 而不是 malloc()。第 3 步如下所示: set ((HFMarkInfo*)hf_state->marks->data)->options = $3
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 2011-01-30
    相关资源
    最近更新 更多