【问题标题】:How can I write bytes to memory using gdb?如何使用 gdb 将字节写入内存?
【发布时间】:2019-08-29 14:32:51
【问题描述】:

与本题相关:In gdb, how can I write a string to memory?

但是,我的问题是关于如何编写非 ASCII 字符,我遇到了麻烦。

看起来我不仅要指定我想写的字符数

set {char[<number of characters>]},但我似乎无法转义字符串中的字符。

考虑:

set {char [5]} 0x618204 = "ABCD"

这应该是等价的:

set {char [5]} 0x618204 = "ABC\x44"

没有错误,但这会将字符串完全视为其他内容,我什至不确定这是做什么的。

我怎样才能用这样的转义字符写一个字符串,我想要某种方式将任意字节写入内存,最好不需要事先告诉 GDB 我打算写多少字节。

我想要一些简单的东西,比如:

set 0x618204 = \x41\x42\x43\x44\x45

这应该将字节 0x41 0x42 0x43 0x44 0x45 写入内存,从地址 0x618204 开始。

我只是错过了正确的语法,还是不存在? GDB 是否有一些扩展可以做到这一点?全球环境基金,佩达?

【问题讨论】:

  • 如果您可以将这些字节放入文件中,restore 命令可能会很有用。

标签: memory gdb


【解决方案1】:

没有错误,但这会将字符串完全视为其他内容

不,它没有:

(gdb) start
Temporary breakpoint 1 at 0x1129: file t.c, line 3.
Starting program: /tmp/a.out

Temporary breakpoint 1, main () at t.c:3
3     char buf[] = "abcd";
(gdb) n
4     void *p = buf;
(gdb) n
5     return 0;
(gdb) p p
$1 = (void *) 0x7fffffffdb93
(gdb) p {char[4]}p
$2 = "abcd"
(gdb) set {char[4]}p = "ABC\x44"
Too many array elements

这里的错误是因为char[4] 没有考虑终止NUL

(gdb) set {char[5]}p = "ABC\x44"
(gdb) p buf
$3 = "ABCD"

瞧!

【讨论】:

    猜你喜欢
    • 2013-10-30
    • 2015-10-03
    • 2020-03-28
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 2020-11-25
    • 1970-01-01
    相关资源
    最近更新 更多