使用 gnu asm 在 x64 中使用参数执行

Posted

技术标签:

【中文标题】使用 gnu asm 在 x64 中使用参数执行【英文标题】:Execve with argument in x64 with gnu asm 【发布时间】:2021-10-08 04:15:50 【问题描述】:

我正在尝试在 GNU asm 中为 linux 编写 shellcode,但我无法使用参数调用 execve。

我想做什么:

execve("/bin/ls", ["/bin/ls", "-la", NULL], NULL);

这是我的代码:

.section .text
.globl _start
_start:
    push $0x3b
    pop %rax
    xorq %rdx,%rdx
    
    push %rdx
    movabs $0x61616161616c2d2d,%r8
    shr $0x8, %r8
    push %r8
    
    movabs $0x736c2f6e69622f2f,%r8
    shr $0x8, %r8                    
    push   %r8
    mov    %rsp,  %rdi
    push   %rdx
    push   %rdi
    mov    %rsp,  %rsi
    syscall
    
    push $0x3c
    pop %rax
    xorq    %rdi,  %rdi
    syscall

就在 execv 系统调用之前,这是我的 reg/stack : gdb

我想: RDI 必须包含“/bin/ls”地址 RSI 必须包含“/bin/ls”地址的地址 RDX = NULL

shellcode 正在执行 /bin/ls 但不使用 -la args。

怎么了?

谢谢

【问题讨论】:

参数是一个C风格的数组,指向指针的指针。 【参考方案1】:

您从未将指针推送到第二个 argv 字符串。 push %rdx; push %rdi 推送 NULL,然后是指向 "/bin/ls" 的指针,但没有指向您的 "-laaaaa" 的指针。您需要在两者之间再添加一个push。例如:

    push %rdx           // NULL
    lea 8(%rdi), %rcx   // pointer to "-laaaaa"
    push %rcx
    push %rdi           // pointer to "/bin/ls"
    mov %rsp, %rsi      // pointer to the argument vector

【讨论】:

以上是关于使用 gnu asm 在 x64 中使用参数执行的主要内容,如果未能解决你的问题,请参考以下文章

谜团:将 GNU C 标签指针转换为函数指针,并使用内联 asm 在该块中放置一个 ret。块被优化掉?

通过 DLL 在 x64 上进行内联汇编

如何将 x86 和 x64 asm 文件包含到单个 Visual Studio 项目中?

x64 asm如何将函数指针设置为_cdecl C函数并调用它?

翻译 | “扩展asm”——用C表示操作数的汇编程序指令

在 x64 上获取不带 __asm 的 SSE 版本