【发布时间】:2021-05-05 18:57:45
【问题描述】:
我成功构建了我的 shellcode。
[BITS 64]
segment .text
global _start
_start: jmp call
back: lea rsi, [rsp]
mov rdi, [rsi]
xor rax, rax
push rax
lea rdx, [rsp]
mov al, 0x3b
syscall
call: call back
db "/bin/sh",0
但代码执行有一些神秘之处。我仍然无法弄清楚是什么问题,也许有人能够提供帮助。
当我使用radare2调试代码时,设置参数和系统调用的整个过程会执行两次。我不知道它有什么问题。寄存器,翻录等看起来不错。最后,shell 在第二个循环后弹出。但是对于堆栈上的执行来说,这是一件很痛苦的事情,因为我的 /bin/sh 在第二个循环中搞砸了。
第一个系统调用返回 -14(错误地址)
我已经尝试了一些代码变体和 RTFM。帮助
提前谢谢你:)
【问题讨论】:
-
有趣;通常 jmp/call 技巧是使用
pop将地址放入寄存器中完成的,但在这里您实际上是在尝试在堆栈上构建指针数组,而不是仅使用 argv=envp=0。 -
是的,我想自己从头开始,结果就是这样。也许这些额外的字节由于干净的指针排列,在不是 /bin/sh 时会给出一些额外的“umpf”?
标签: linux assembly x86-64 shellcode