下面是我的shellcode:
xor rax, rax
xor rdi, rdi
xor rsi, rsi
xor rdx, rdx
; getting address of `pathname`
mov rdi, [something]
mov al, 59
mov rdi, rsp
syscall
xor rax,rax
mov al, 60
xor rdi, rdi
syscall
_pathname:
db "/usr/bin/shutdown",0
字符串
简单的execve
和退出,就这样。问题是我无法获得绝对地址以访问 pathname。我找到的“解决方案”是这样操纵代码:
call _end
_start:
pop rdi ; absolute address of _start
; then add bytes to get to address of _end
_end:
call start
db "/usr/bin/shutdown", 0
型
这对我来说从来没有意义,它没有工作。我还尝试使用FPU指令,这是应该工作以及,但他们也没有工作。
有人有办法吗?
操作系统:Linux
体系结构:amd64
1条答案
按热度按时间4szc88ey1#
在x86-64上,您有RIP相对寻址模式,因此您应该能够简单地执行
lea rdi, [rel _pathname]
。汇编程序计算当前指令(或实际上是下一条指令)的地址与标签_pathname
之间的位移,并将其编码到指令中。在运行时,该位移被添加到rip
,结果被放置在rdi
中。x86-32没有相对寻址模式,因此在32位模式下,
call/pop
技巧是实现这一点的标准方法,尽管有点笨拙。而且它也可以在64位模式下工作。但是pop rdi
弹出的地址不是_start
的地址;而是call _start
指令推送的返回地址,即call _start
指令后的字节地址。在本例中,它正好是/usr/bin/shutdown
字符串的第一个字节,因此实际上不必添加任何内容。请注意,您正在将空指针作为
argv
和envp
参数传递给execve
。这对于内核来说是法律的的,但是shutdown
程序可能没有预料到这一点,它可能会在启动时崩溃。所以你可能需要做更多的工作来构造一个最小参数向量,至少要有argv[0] == "shutdown"
。