首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用气体,我如何才能得到一个特定的标签的偏移量?

使用气体,我如何才能得到一个特定的标签的偏移量?
EN

Stack Overflow用户
提问于 2015-06-02 22:27:41
回答 2查看 1.7K关注 0票数 1

我正在使用pwnlib编写一个小的外壳代码来应对挑战。我的外壳代码需要修改自己以传递应用程序过滤器。我第一次用nasm写了这篇文章,做了这样的事情:

代码语言:javascript
复制
        sub        edx, edx
        mov        dl, 0x82
        add        al, do_mov_rdi_rax
        sub        dword [rax], edx
        mov        dh, 0x82
        add        al, do_syscall - do_mov_rdi_rax
        sub        dword [rax], edx
        shr        edi, 31

    do_mov_rdi_rax:
        ; mov    rsi, rax
        ; (with 0x82 added to first byte to pass validation)
        db         0xca, 0x89, 0xc6
        sub        eax, eax

    do_syscall:
        ; syscall
        ; (with 0x82 added to both bytes to pass validation)
        db         0x91, 0x87

然而,Pwnlib使用gas,所以我的程序集代码必须符合它的语法。除了显而易见的(//而不是;.byte而不是db)之外,我还有最后一个问题:尽管nasm很高兴地将我的标签转换为整数(对于add al, do_mov_rdi_raxadd al, do_syscall - do_mov_rdi_rax),但gas一直告诉我,它不能表示寻址类型BFD_RELOC_8,或者类似的东西(我最终得到了法语版本的gas,很抱歉缺少错误消息)。

我怎样才能得到作为整数的标签的地址?我的外壳代码基于地址0( gas是用.org 0x0告诉的)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-03 05:15:31

由于标签不起作用,我仔细阅读了gas文档,发现创建表达式符号也是可能的,而且可以使用.获取位置的地址。事实证明,使用Mach-O输出格式,gas将接受以下内容:

代码语言:javascript
复制
.set main, .
    sub     edx, edx
    mov     dl, 0x82
    add     al, do_mov_rdi_rax - main
    sub     dword [rax], edx
    mov     dh, 0x82
    add     al, do_syscall - do_mov_rdi_rax
    sub     dword [rax], edx
    shr     edi, 31

.set do_mov_rdi_rax, .
    // mov  rsi, rax
    // (with 0x82 added to first byte to pass validation)
    .byte   0xca, 0x89, 0xc6
    sub     eax, eax

.set do_syscall, .
    // syscall
    // (with 0x82 added to both bytes to pass validation)
    .byte   0x91, 0x87

首先,简单地使用do_mov_rdi_rax是行不通的,但是使用它和main之间的区别是非常有效的。(但是,用文字0替换main并不能做到这一点。)

不过,它还有其他问题:似乎缺乏对sub dword [rax], edx的支持。在我的Mac上安装了gas 2.25,它被组装成sub dword [rax+4], edx,这是非常错误的。Xcode附带的as版本拒绝组装它,理由是绝对使用32位寻址;gas 2.24.90也拒绝组装它,因为不知何故,会有太多内存引用。因为这一切都是不正确的,我将坚持使用nasm组装的二进制版本的外壳代码,而不是使用pwnlib的asm来编译它。

票数 2
EN

Stack Overflow用户

发布于 2015-06-03 04:03:04

您正在做的事情是非常不寻常的,看起来它需要重新定位,而OS所使用的Mach-O对象格式却不支持这种迁移。问题不在于你试图使用一个标签作为一个整数,而是你试图使用一个标签作为一个8位整数。这在实践中并不是很有用,而且编译器永远也不会这么做。

如果您真的只想将符号地址的下8位(或两个符号之间的差异)添加到RAX的较低的8位,您将首先使用标签作为32位整数。

例如,您可以先将其移动到另一个32位寄存器中:

代码语言:javascript
复制
    mov $do_mov_rdi_rax, %ecx
    add %cl, %al
...
    mov $(do_syscall - do_mov_rdi_rax), %ecx
    add %cl, %al

如果您没有可用的寄存器,而不是从内存中加载它:

代码语言:javascript
复制
    add indirect_do_mov_rdi_rax, %al
...
    add indirect_difference, %al

indirect_do_mov_rdi_rax:
    .long   do_mov_rdi_rax

indirect_difference:
    .long   do_syscall - do_mov_rdi_rax

如果真的不想使用8位算术,并且想使用地址的所有64位进行加法,那么您可以使用64位寄存器RAX:

代码语言:javascript
复制
    add $do_mov_rdi_rax, %rax
...
    add $(do_syscall - do_mov_rdi_rax), %rax
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30607703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档