与这个问题有关:在 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"