使用汽油,我如何获得特定标签的偏移量?

时间:2015-06-02 22:27:41

标签: assembly gas

我正在使用pwnlib为挑战编写一个小型shellcode。我的shellcode需要修改自己以传递应用程序过滤器。我首先用nasm写了它,并做了类似的事情:

        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,抱歉缺少错误信息。)

如何将标签的地址作为整数?我的shellcode基于地址0(气体通过.org 0x0告知)。

2 个答案:

答案 0 :(得分:0)

您正在做的事情非常不寻常,看起来它需要重新定位,OS X使用的Mach-O对象格式不支持。问题不在于您尝试将标签用作整数,而是您尝试将标签用作8位整数。这在实践中并不是很有用,编译器永远不会做的事情。

如果您确实只想将符号地址的低8位(或两个符号之间的差值)添加到RAX的低8位,那么您将首先将标签用作32位整数。

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

    mov $do_mov_rdi_rax, %ecx
    add %cl, %al
...
    mov $(do_syscall - do_mov_rdi_rax), %ecx
    add %cl, %al

如果您没有免费注册,请从内存中加载:

    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:

    add $do_mov_rdi_rax, %rax
...
    add $(do_syscall - do_mov_rdi_rax), %rax

答案 1 :(得分:0)

由于标签不起作用,我挖掘了var myFunction = function (param1,cb) { async.waterfall([ function(callback) { callback(param1); } function(param1 ,callback) { callback(param1); }, function(param1 , callback) { callback(null, 'result'); } ], function (err, result) { if (typeof cb === "function") { cb(err,results); } }); } 文档,发现也可以创建表达式符号,并且可以使用gas来获取位置的地址。事实证明,使用Mach-O输出格式,.将接受此:

gas

在第一次添加时,只使用.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之间的差异非常有效。 (但是,用{0}代替main将不会这样做。)

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