【发布时间】:2018-04-29 22:49:07
【问题描述】:
我要写一些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())(至少我希望如此)。它不会使程序崩溃或搞砸任何事情,问题是它不做任何事情。例如,我把执行 /bin/sh 的 shellcode 放在这之后, /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,而不是其他的。 strace 不应该只识别setreuid 吗?
【问题讨论】:
-
您只设置了
al而不是eax。据推测,最高位包含一些之前的垃圾。其实4294957257=0xFFFFD8C9这样你就可以看到垃圾了。 -
哇,我觉得自己很笨。
xor %eax, %eax在每个系统调用修复它之后。 -
before 每个
mov到%al都是你真正需要的;在实际的 shellcode 中,你不能依赖%eax在进入你的有效载荷时为零。