assembly 获取shellcode中数据的绝对地址

xqk2d5yq  于 2023-08-06  发布在  Shell
关注(0)|答案(1)|浏览(124)

下面是我的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

4szc88ey

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字符串的第一个字节,因此实际上不必添加任何内容。
请注意,您正在将空指针作为argvenvp参数传递给execve。这对于内核来说是法律的的,但是shutdown程序可能没有预料到这一点,它可能会在启动时崩溃。所以你可能需要做更多的工作来构造一个最小参数向量,至少要有argv[0] == "shutdown"

相关问题