我正在使用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_rax
和add al, do_syscall - do_mov_rdi_rax
),gas
一直告诉我它不能代表寻址类型BFD_RELOC_8
,或类似的东西(我不知何故)结果是法语版gas
,抱歉缺少错误信息。)
如何将标签的地址作为整数?我的shellcode基于地址0(气体通过.org 0x0
告知)。
答案 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
来编译它。