如何使用 gdb 将字节写入内存?



与这个问题有关:在 gdb 中,如何将字符串写入内存?

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

似乎我不仅必须指定要写的字符数

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

考虑:

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

这应该是等效的:

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

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

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

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

set 0x618204 = x41x42x43x44x45

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

我只是缺少正确的语法,还是它不存在?是否有一些GDB扩展可以做到这一点?GEF,佩达?

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

不,它不会:

(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 = "ABCx44"
Too many array elements

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

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

瞧!

您可以使用set命令使用 GDB 写入内存:

以下是如何使用 GDB 更改内存中单个字节的示例:

pwndbg> x/bx 0x7fffffffdb7f
0x7fffffffdb7f: 0x30
pwndbg> set *0x7fffffffdb7f=0x00
pwndbg> x/bx 0x7fffffffdb7f
0x7fffffffdb7f: 0x00

您也可以写入多个字节,但必须注意字节序。

pwndbg> set *0x7fffffffdb78=0x00414243
pwndbg> x/s 0x7fffffffdb78
0x7fffffffdb78: "CBA"
pwndbg> set *0x7fffffffdb78=0x0068732f6e69622f
pwndbg> x/s 0x7fffffffdb78
0x7fffffffdb78: "/bin/sh"

最新更新