我必须编写一些shellcode,并且有一部分不起作用:
0: b0 c9 mov $0xc9,%al
2: cd 80 int $0x80
4: 89 c3 mov %eax,%ebx
6: 89 c1 mov %eax,%ecx
8: b0 cb mov $0xcb,%al
a: cd 80 int $0x80
相当于setreuid(geteuid(),geteuid())
(至少我希望是这样)。它不会崩溃程序或弄乱任何东西,问题是它没有任何。例如,我把shellcode执行后执行/ bin / sh并且/ bin / sh执行正常。任何与setuid相关的系统调用似乎都没有任何影响。
当我运行strace时,它会输出:
syscall_4294957257(0, 0x8048552, 0xffffd875, 0xf7fc7000, 0xf7fc7000, 0xffffd618) = -1 (errno 38)
syscall_4294967243(0xffffffda, 0xffffffda, 0xffffd875, 0xf7fc7000, 0xf7fc7000, 0xffffd618) = -1 (errno 38)
execve("/bin//sh", NULL, NULL) = 0
我为setuid(id)
和getuid()
获得了相同的输出。所以我想知道为什么strace认为execve是execve,而不是其他人。不应该仅仅识别setreuid
?
答案 0 :(得分:1)
linux系统调用从x86下的EAX寄存器中读取系统调用号。通过将C9移动到AL,您只需设置EAX的底部8位,其余部分留下垃圾。这就是为什么strace调用你所做的“syscall_4294957257”:它是十六进制的FFFFD8C9。 (请注意,它以C9结尾。)这也是为什么你看到errno 38
,它转换为ENOSYS
“函数未实现”,换句话说,“我不知道你是什么请我做“。
解决方案是在设置eax
之前清除al
,如下所示:
31 c0 xor eax,eax
b0 c9 mov al,0xc9