我正在使用pwnlib编写一个小的外壳代码来应对挑战。我的外壳代码需要修改自己以传递应用程序过滤器。我第一次用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_rax和add al, do_syscall - do_mov_rdi_rax),但gas一直告诉我,它不能表示寻址类型BFD_RELOC_8,或者类似的东西(我最终得到了法语版本的gas,很抱歉缺少错误消息)。
我怎样才能得到作为整数的标签的地址?我的外壳代码基于地址0( gas是用.org 0x0告诉的)。
发布于 2015-06-03 05:15:31
由于标签不起作用,我仔细阅读了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是行不通的,但是使用它和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来编译它。
发布于 2015-06-03 04:03:04
您正在做的事情是非常不寻常的,看起来它需要重新定位,而OS所使用的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), %raxhttps://stackoverflow.com/questions/30607703
复制相似问题