我想寫的32位Linux的shellcode內核模式將做到這一點:內核漏洞的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
作爲CALL,我的玩具漏洞對我的人造內核錯誤工作正常,但是當我使用來自nasm/objdump的組合機器代碼時失敗。
謝謝。不,這不是功課。我只是試圖讓自己的玩具利用我自己的內核(空指針解引用)。如果我組裝「調用0xc1066480」和「調用0xc1066380」,我就可以在它們兩個上獲得e8 7c。 (.m文件中的nasm -f elf,objdump -d)。 – ioctlvoid 2013-02-19 15:51:04