【问题标题】:How to convert an assembler program to shellcode correctly?如何正确地将汇编程序转换为 shellcode?
【发布时间】:2019-12-24 12:44:09
【问题描述】:

我用 nasm (x64) 编写了一个程序,它应该执行 /bin/bash,并且运行良好。然后我用objdump -D 运行程序,我写下这样的机器代码:\xbb\x68\x53\x48\xbb\x2f\x62\x69\x6e\x2f\x62\x61\x73\x53\x48\x89\xe7\x50\x57\x48\x89\xe6\xb0\x3b\x0f\x05。然后我用./shell $(python -c 'print "\xbb\x68\x53\x48\xbb\x2f\x62\x69\x6e\x2f\x62\x61\x73\x53\x48\x89\xe7\x50\x57\x48\x89\xe6\xb0\x3b\x0f\x05"') 运行它,我收到一条非法指令。但是汇编程序运行良好!有人可以帮忙吗?

shell.c:

int main(int argc, char **argv) {
    int (*func)();
    func = (int (*)()) argv[1];
    (int)(*func)();
}

bash.asm:

section .text
global start
start:
    mov rbx, 0x68
    push rbx
    mov rbx, 0x7361622f6e69622f
    push rbx
    mov rdi, rsp
    push rax
    push rdi
    mov rsi, rsp
    mov al, 59
    syscall

objdump:

./bash:     file format elf64-x86-64


Disassembly of section .text:

0000000000401000 <start>:
  401000:   bb 68 00 00 00          mov    $0x68,%ebx
  401005:   53                      push   %rbx
  401006:   48 bb 2f 62 69 6e 2f    movabs $0x7361622f6e69622f,%rbx
  40100d:   62 61 73 
  401010:   53                      push   %rbx
  401011:   48 89 e7                mov    %rsp,%rdi
  401014:   50                      push   %rax
  401015:   57                      push   %rdi
  401016:   48 89 e6                mov    %rsp,%rsi
  401019:   b0 3b                   mov    $0x3b,%al
  40101b:   0f 05                   syscall

【问题讨论】:

  • 您遗漏了第一条指令的 3 个零字节。像这样的 shellcode 不应该有零字节,但这并不意味着你可以简单地将它们排除在外。您需要编写没有它们的代码。你可以只做push $0x68 而不是前两条指令。 PS:您使用 rax 时未对其进行初始化,这不太可能可靠地工作。
  • @Jester 谢谢你的提示。但是当我用 strace 运行 shellcode 时,我得到了这个。 execve("/bin/bash", ["/bin/bash"], 0x7ffcdcd335eastrace: umoven: short read (6 &lt; 8) @0x7ffcdcd33ffa /* 322 vars, unterminated */) = -1 EFAULT (Ungültige Adresse) --- SIGSEGV {si_signo=SIGSEGV, si_code=SI_KERNEL, si_addr=NULL} --- +++ killed by SIGSEGV +++
  • 您可能希望查看这个答案,它通过使用不同的指令消除 NUL (0) 字节并执行 /bin/sh (您可以将其修改为使用 /bin/bashstackoverflow.com/a/57295376/3857942 。它还提供了一种自动生成 shellcode 字符串的机制,而不是手动从 objdump 复制信息。
  • 您的代码不会将 RDX(这是最后一个参数)归零。

标签: c assembly nasm shellcode


【解决方案1】:

您在这里省略了零字节:

\xbb\x68\x53\x48\xbb\x2f\x62\x69\x6e\x2f\x62\x61\x73\x53\x48\x89\xe7\x50\x57\x48\x89\xe6\xb0\x3b\x0f\x05

相对

  401000:   bb 68 00 00 00          mov    $0x68,%ebx

零字节是指令的一部分,不能跳过。所以你必须包括它们。

然而,问题是零字节会终止参数字符串,因此必须避免。作为 shellcode 设计者,你有责任以某种方式构造它,它不包含可能不会出现的字节值。在许多情况下,这意味着没有零字节,因为 shellcode 是作为 C 字符串注入的,但其他值在其他情况下也可能有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-04
    • 2023-04-08
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 2017-08-31
    • 1970-01-01
    相关资源
    最近更新 更多