我想在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 7ce8 74代替第二个e8 7c是可行的。我不记得我从哪里获得了第二个机器代码(我在另一个文件中保存了它),但是我很好奇为什么这会起作用,而不是简单地将其组装成这样。

这是什么类型的CALL?如上所示,简单地汇编代码为什么不起作用?如果我对调用使用e8 79e8 74,我的玩具漏洞利用程序可以很好地解决人为的内核错误,但是当我使用nasm / objdump中的汇编机器代码时,我的玩具攻击程序将无法正常工作。

最佳答案

以E8h开头的CALL变体接近对相对于当前指令的位移指定的地址的调用。这解释了为什么不同指令的值需要不同。不过,我不知所措,您不知道如何发出该代码。您确定这不是作业吗?

关于linux - 内核利用Shellcode,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14949289/

10-10 08:07