You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何精简x86-64 Linux下调用chmod系统调用的Shellcode指令?

精简x86-64 Linux chmod Shellcode方案

你的核心问题是构造/flag字符串时的指令冗余,以及错误的压栈方式导致路径无效。以下是具体的精简思路和最终代码:

为什么你的尝试无效

你用push 0x67 + push 0x616c662f的方式,在x86-64中:

  • push 0x616c662f会将32位立即数零扩展为64位,压入栈的是0x00000000616c662f,对应字节序列是0x2f 0x66 0x6c 0x61 0x00 0x00 0x00 0x00,中间出现空字节,破坏了/flag的连续性。
  • push 0x67会将8位立即数符号扩展为64位,压入0x0000000000000067,栈中g的位置在空字节之后,导致路径变为/fla\0...g,无法被内核正确解析。

精简后的Shellcode

通过一次性构造带空结尾的完整路径字符串,合并冗余的寄存器初始化指令,最终代码仅需5条指令:

push 0x67616c662f        ; 压入64位立即数,栈中字节序列为0x2f('/')、0x66('f')、0x6c('l')、0x61('a')、0x67('g')、0x00、0x00、0x00
mov eax, 0x5a            ; 直接设置rax为chmod系统调用号90(0x5a),mov eax自动清零rax高32位
mov rdi, rsp             ; 路径参数指向栈顶的"/flag"字符串
mov esi, 0x1ff           ; 设置权限为777(0x1ff),mov esi自动清零rsi高32位
syscall

关键精简点

  1. 合并字符串构造:用单条push指令构造完整的/flag\0\0\0字符串(x86-64中push立即数会自动补零到64位,刚好满足路径的空结尾要求),替代原有的3次push+寄存器操作。
  2. 简化系统调用号设置:用mov eax, 0x5a替代xor rax,rax + mov al,0x5a,一条指令完成rax初始化。
  3. 简化权限参数设置:用mov esi,0x1ff替代xor rsi,rsi + mov rsi,0x1ff,一条指令完成rsi初始化。

内容的提问来源于stack exchange,提问作者Tanmay Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:27:38