如何在gdb中直接运行汇编代码?

8

我可以使用call来执行C函数,但是如何直接运行汇编甚至shell代码呢?

2个回答

9
要执行 shell 代码,您可以直接编辑函数的内容:
(gdb) b foo
Breakpoint 1 at 0x400608
(gdb) run
Breakpoint 1, 0x0000000000400608 in foo ()
(gdb) x/16bx foo
0x400604 <foo>:        0x55    0x48    0x89    0xe5    0x53    0x48    0x81   0xec
(gdb) set ((unsigned char *)foo)[6] = 0x85
(gdb) x/16bx foo
0x400604 <foo>:        0x55    0x48    0x89    0xe5    0x53    0x48    0x85   0xec
(gdb) cont

我不知道如何在gdb中执行操作码,但你可以随意使用寄存器。例如,你可以使用set $rax = $rbx代替mov %rbx, %rax

(gdb) p $rax
$1 = 3671197290184
(gdb) set $rax = $rbx
(gdb) p $rax
$2 = 0
(gdb)

“let”和“set”的区别是什么? - compiler
抱歉,那是打错字了,应该是“set”。我会修正这篇文章。 - sam hocevar
是否有类似于 Python Shell 的环境可以用来编写汇编代码? - debug

0

我认为gdb不包括汇编器,因此我不会期望能够直接输入汇编代码。

您可以使用shell gdb命令来运行shell命令:

(gdb) shell uname -m
x86_64

1
但是在 C 中,我们可以直接嵌入汇编代码,对吧?我指的是像 \x23\x24... 这样的 shell 代码。 - compiler
"Shellcode"在编译器中指的是由CPU执行的特定类型的二进制代码。 - sam hocevar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接