gpt4 book ai didi

assembly - 这个shellcode中使用的堆栈指针是什么?

转载 作者:行者123 更新时间:2023-12-04 14:46:26 25 4
gpt4 key购买 nike

https://www.exploit-db.com/exploits/46907

global _start
section .text
_start:
xor rsi,rsi
push rsi
mov rdi,0x68732f2f6e69622f
push rdi
push rsp
pop rdi
push 59
pop rax
cdq
syscall
一条指令是 push %rsp ,然后将其弹出 rdi .我很迷惑。根据文档, rdiexecve syscall 应包含可执行文件的路径名。和 rsp有什么关系这里?其他 shellcode 不操作 rsp .

最佳答案

在堆栈上构造数据,然后将堆栈指针复制到另一个reg,完全正常。许多 shellcode 操作 RSP。push rsp/pop rdi只是 mov rdi, rsp 的 2 字节版本, 它是在推送 0 和 8 字节的 ASCII 数据之后出现的。 (在 NASM 语法中可以更清楚地写成 mov rdi, '/bin//sh' )。
使用调试器单步执行 asm,并在 syscall 时查看 RDI 指向的内存执行,然后向后工作以了解您是如何到达那里的。

奇怪的是他们打高尔夫球 mov rdi,rsp使用 push/pop 减少到 2 个字节,但在其异或归零指令上使用了 REX 前缀。 xor esi,esi是等价的。 NASM 会将该源优化为 xor esi,esi ,但您的链接显示了反汇编。
另外,push 59/pop raxstandard 3-byte way to construct a small constant ( __NR_execve ) 在一个寄存器中,而不依赖于任何其他寄存器值。他们本来可以做 lea eax, [rsi+59]这也是 3 个字节,也避免了任何 0字节。 (5 字节 mov eax, 59 将包含一个带有三个零字节的 imm32,这就是大多数 shellcode 必须避免它的原因。)cdq只需设置 RDX=0 ( envp=NULL ),因为此时 EAX 的符号为正。与 xor edx,edx 相比,另一种节省字节的代码方法.在这种情况下,他们显然知道在编写 32 位 reg (EDX) 时利用完整 64 位 reg 的隐式归零,所以更奇怪的是他们使用 64 位异或归零进行 RSI。也许他们对 x86-64 了解不多,甚至没有意识到 cqo将明确使用 64 位操作数大小,将 RAX 符号扩展为 RDX:RAX,并打算在任何地方使用 64 位,因为他们认为他们需要。

关于assembly - 这个shellcode中使用的堆栈指针是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69944825/

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