繁体   English   中英

如何正确地将汇编程序转换为shellcode?

[英]How to convert an assembler program to shellcode correctly?

我在 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"')并且我得到了一个非法指令。 但是汇编程序运行良好! 有人可以帮忙吗?

外壳.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

对象转储:

./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

您在这里省略了零字节:

\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 字符串注入,但其他值在其他情况下也可能有问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM