【问题标题】:How to run assembly in gdb directly?如何直接在 gdb 中运行程序集?
【发布时间】:2026-02-09 02:05:01
【问题描述】:

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

【问题讨论】:

    标签: assembly gdb


    【解决方案1】:

    我不认为gdb包含汇编器,所以我不希望能够直接进入汇编。

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

    (gdb) shell uname -m
    x86_64
    

    【讨论】:

    • 但是在c中我们可以直接嵌入汇编,对吧?在这里,我指的是 shell 代码中的 \x23\x24... 之类的东西
    • 通过“shellcode”,编译器表示由 CPU 执行的特定类型的binary code
    【解决方案2】:

    要执行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)
    

    【讨论】:

    • letset有什么区别?
    • 抱歉,打错字了,应该是set。我会修复帖子。
    • 是否有类似 python shell 的 env 用于汇编代码?