我想在32位Linux上为内核模式编写shellcode,它将执行以下操作:
commit_creds (prepare_kernel_cred(0));
所以我创建一个文件:
xor eax, eax
call 0x1234567
call 0x1234568
ret
其中0x1234567是prepare_kernel_cred的地址,0x1234568是commit_creds的地址,均可从/ proc / kallsyms找到。
我将其与nasm -f elf和objdump -d组装在一起以获取机器代码。
我得到类似的东西:
31 c0 which is xor eax, eax
e8 7c 67 06 c1 which is call prepare_kernel_cred
e8 7c 65 06 c1 which is call commit_creds
c3 which is ret
这行不通。但是,使用
e8 79
代替e8 7c
和e8 74
代替第二个e8 7c
是可行的。我不记得我从哪里获得了第二个机器代码(我在另一个文件中保存了它),但是我很好奇为什么这会起作用,而不是简单地将其组装成这样。这是什么类型的
CALL
?如上所示,简单地汇编代码为什么不起作用?如果我对调用使用e8 79
和e8 74
,我的玩具漏洞利用程序可以很好地解决人为的内核错误,但是当我使用nasm / objdump中的汇编机器代码时,我的玩具攻击程序将无法正常工作。 最佳答案
以E8h开头的CALL变体接近对相对于当前指令的位移指定的地址的调用。这解释了为什么不同指令的值需要不同。不过,我不知所措,您不知道如何发出该代码。您确定这不是作业吗?
关于linux - 内核利用Shellcode,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14949289/