【发布时间】: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 < 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/bash:stackoverflow.com/a/57295376/3857942 。它还提供了一种自动生成 shellcode 字符串的机制,而不是手动从 objdump 复制信息。 -
您的代码不会将 RDX(这是最后一个参数)归零。