【发布时间】:2019-12-08 16:23:07
【问题描述】:
我有这样一个运行shell的代码:
BITS 64
global _start
_start:
mov rax, 59
jmp short file
c1:
pop rdi
jmp short argv
c2:
pop rsi
mov rdx, 0
syscall
file:
call c1
db '/bin/sh',0
argv:
call c2
dq arg, 0
arg:
db 'sh',0
以这种方式构建时它可以工作:
nasm -f elf64 shcode.asm
ld shcode.o -o shcode
Althougt,当我把它变成二进制形式时:
nasm -f bin shcode.asm
将其粘贴到以下 C++ 代码中:
int main(void)
{
char kod[]="\xB8\x3B\x00\x00\x00\xEB\x0B\x5F\xEB\x15\x5E\xBA\x00\x00\x00\x00\x0F\x05\xE8\xF0\xFF\xFF\xFF\x2F\x62\x69\x6E\x2F\x73\x68\x00\xE8\xE6\xFF\xFF\xFF\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x73\x68\x00";
reinterpret_cast<void(*)()>(kod)();
return 0;
}
使用 clang++ texp.cpp -o texp.e -Wl,-z,execstack 并执行,shell 没有运行。
运行后
strace ./texp.e
我看到了这样的东西(我用 ^C 停止了这个过程):
syscall_0xffffffffffffffda(0x7ffc23e0a297, 0x7ffc23e0a2a4, 0, 0x4a0, 0x7fe1ff3039b0, 0x7fe1ff69b960) = -1 ENOSYS (Nie zaimplementowana funkcja)
syscall_0xffffffffffffffda(0x7ffc23e0a297, 0x7ffc23e0a2a4, 0, 0x4a0, 0x7fe1ff3039b0, 0x7fe1ff69b960) = -1 ENOSYS (Nie zaimplementowana funkcja)
.
.
.
syscall_0xffffffffffffffda(0x7ffc23e0a297, 0x7ffc23e0a2a4, 0, 0x4a0, 0x7fe1ff3039b0, 0x7fe1ff69b960) = -1 ENOSYS (Nie zaimplementowana funkcja)
^Csyscall_0xffffffffffffffda(0x7ffc23e0a297, 0x7ffc23e0a2a4, 0, 0x4a0, 0x7fe1ff3039b0, 0x7fe1ff69b960strace: Process 2806 detached
<detached ...>
Nie zaimplementowana funkcja - 功能未实现
所以程序(又名 shellcode)可能正在运行不正确的系统调用。
【问题讨论】:
-
离题:你不需要单独的
jmp/call/pop序列:一旦你有了一个序列,你就可以用lea rsi, [rdi + argv - file_data]得到另一个4 字节的lea。 (在文件中的db以及call上放置file_data标签。)
标签: c++ linux assembly nasm system-calls