PIC(Position-Independent Code) : ์ฌ๋ฐฐ์น๊ฐ ๊ฐ๋ฅํ ์ฝ๋
= ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ ์ฃผ์์ ์ ์ฌ๋์ด๋ ์ฝ๋์ ์๋ฏธ๊ฐ ํผ์๋์ง ์๋ ์ฝ๋
PIC๋ฅผ ์ ์ฉํ๋ฉด ๋ฌธ์์ด ์ฃผ์๋ฅผ RIP + 0xa2์ ๊ฐ์ด ์๋ ์ฃผ์๋ก ์ฐธ์กฐํ๋ค. ๊ทธ๋ฌ๋ PIC๋ฅผ ์ ์ฉํ์ง ์์ผ๋ฉด 0x4005a1๊ณผ ๊ฐ์ด ์ ๋ ์ฃผ์๋ก ๋ฌธ์์ด์ ์ฐธ์กฐํ๋ค.
push rbp
mov rbp,rsp
-mov rax,QWORD PTR [rip+0x200b3e] # 0x601030 <data>
+mov rax,QWORD PTR [rip+0x2009ab] # 0x201010 <data>
mov rsi,rax
-mov edi,0x4005a1
+lea rdi,[rip+0xa2] # 0x711
mov eax,0x0
-call 0x4003f0 <printf@plt>
+call 0x530 <printf@plt>
mov eax,0x0
pop rbp
ret
- ๋ถ๋ถ์ด Pic ์๋ ์ฝ๋, + ๋ถ๋ถ์ด Pic ์๋ ์ฝ๋์ด๋ค.
PIE(Position-Independent Executable) : ์ฌ๋ฐฐ์น๊ฐ ๊ฐ๋ฅํ ์คํ ํ์ผ
= ๋ฌด์์ ์ฃผ์์ ๋งคํ๋ผ๋ ์คํ ๊ฐ๋ฅํ ์คํ ํ์ผ
๋ฆฌ๋
์ค์ ๊ธฐ๋ณธ ์คํ ํ์ผ์ธ /bin/ls์ ํ์ผ ํค๋๋ฅผ ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
~$ readelf -h /bin/ls
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Position-Independent Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x6aa0
Start of program headers: 64 (bytes into file)
Start of section headers: 136232 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 13
Size of section headers: 64 (bytes)
Number of section headers: 31
Section header string table index: 30
Type์ ๋ณด๋ฉด DYN(Position-Independent Excutable File)์ด๋ผ๊ณ ์ ํ ์๋ค. ์ด๋ฅผ ํตํด PIE๊ฐ ์ ์ฉ ๋์ด ์์์ ์ ์ ์๋ค.
์๋๋ฉด checksec ๋ช
๋ น์ด๋ฅผ ์ด์ฉํ๋ฉด PIE๊ฐ ์ ์ฉ๋์๋์ง ์๋์๋์ง ์ ์ ์๋ค.
PIE : ์ฝ๋ ์์ญ์ ๋ฌด์์ ์ฃผ์์ ๋งคํ๋๋ ๊ธฐ์
ASLR : ์คํ, ํ, ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ์ด ๋ฌด์์ ์ฃผ์์ ๋งคํ๋๋ ๊ธฐ์
ASLR์ฒ๋ผ ์ฝ๋ ์์ญ์ ๊ฐ์ ฏ์ ์ฌ์ฉํ๊ฑฐ๋, ๋ฐ์ดํฐ ์์ญ์ ์ ๊ทผํ๋ ค๋ฉด ๋ฐ์ด๋๋ฆฌ๊ฐ ์ ์ฌ๋ ์ฃผ์๋ฅผ ์์์ผ ํ๋ค. ์ด ์ฃผ์๋ฅผ PIE ๋ฒ ์ด์ค, ์ฆ ์ฝ๋ ๋ฒ ์ด์ค๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ, ์ด ์ฃผ์๋ฅผ ์์์ผ ์ฝ๋ ์์ญ์ ์์ ์ฃผ์๋ฅผ ์ฝ๊ณ , ์คํ์ ์ผ๋ก ์ฃผ์๋ฅผ ๊ณ์ฐํด์ผ ํ๋ค.
RELRO(RELocation Read-Only) : ์ฐ๊ธฐ ๊ถํ์ด ๋ถํ์ํ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ ์์ญ์ ์ฐ๊ธฐ ๊ถํ์ ์ ๊ฑฐํ๋ ๊ธฐ์
์ ์ฉ ๋ฒ์์ ๋ฐ๋ผ Full RELRO์ Partial RELRO๋ก ๋๋๋ค.
gdb๋ก ์คํํ์ผ์ ๋๋ฒ๊น
ํ๊ณ vmmap์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ๊ถํ์ ํ์ธํ๋ฉด ๋๋ค.pwndbg> vmmap
LEGEND: STACK | HEAP | CODE | DATA | WX | RODATA
Start End Perm Size Offset File
0x400000 0x401000 r-xp 1000 0 /home/li-sh/Desktop/dreamhack/hookoverwrite/hook
0x600000 0x601000 r--p 1000 0 /home/li-sh/Desktop/dreamhack/hookoverwrite/hook
0x601000 0x602000 rw-p 1000 1000 /home/li-sh/Desktop/dreamhack/hookoverwrite/hook
0x602000 0x623000 rw-p 21000 0 [heap]
0x7ffff7c00000 0x7ffff7c28000 r--p 28000 0 /usr/lib/x86_64-linux-gnu/libc.so.6
0x7ffff7c28000 0x7ffff7dbd000 r-xp 195000 28000 /usr/lib/x86_64-linux-gnu/libc.so.6
0x7ffff7dbd000 0x7ffff7e15000 r--p 58000 1bd000 /usr/lib/x86_64-linux-gnu/libc.so.6
0x7ffff7e15000 0x7ffff7e16000 ---p 1000 215000 /usr/lib/x86_64-linux-gnu/libc.so.6
0x7ffff7e16000 0x7ffff7e1a000 r--p 4000 215000 /usr/lib/x86_64-linux-gnu/libc.so.6
0x7ffff7e1a000 0x7ffff7e1c000 rw-p 2000 219000 /usr/lib/x86_64-linux-gnu/libc.so.6
0x7ffff7e1c000 0x7ffff7e29000 rw-p d000 0 [anon_7ffff7e1c]
0x7ffff7fa8000 0x7ffff7fab000 rw-p 3000 0 [anon_7ffff7fa8]
0x7ffff7fbb000 0x7ffff7fbd000 rw-p 2000 0 [anon_7ffff7fbb]
0x7ffff7fbd000 0x7ffff7fc1000 r--p 4000 0 [vvar]
0x7ffff7fc1000 0x7ffff7fc3000 r-xp 2000 0 [vdso]
0x7ffff7fc3000 0x7ffff7fc5000 r--p 2000 0 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x7ffff7fc5000 0x7ffff7fef000 r-xp 2a000 2000 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x7ffff7fef000 0x7ffff7ffa000 r--p b000 2c000 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x7ffff7ffb000 0x7ffff7ffd000 r--p 2000 37000 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x7ffff7ffd000 0x7ffff7fff000 rw-p 2000 39000 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x7ffffffde000 0x7ffffffff000 rw-p 21000 0 [stack]
0xffffffffff600000 0xffffffffff601000 --xp 1000 0 [vsyscall]
/proc/self/maps๋ฅผ ํ์ธํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋งต์ ํ์ธ ํ ์ ์๋ค.
objdump ๋ช
๋ น์ด๋ฅผ ์ด์ฉํ๋ฉด ๊ฐ ์ธ๊ทธ๋จผํธ๊ฐ ์ด๋ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น ๋์ด์๋์ง ํ์ธ ํ ์ ์๋ค.
$ objdump -h ./hook
./hook: file format elf64-x86-64
Sections:
Idx Name Size VMA LMA File off Algn
0 .interp 0000001c 0000000000400238 0000000000400238 00000238 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .note.ABI-tag 00000020 0000000000400254 0000000000400254 00000254 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .note.gnu.build-id 00000024 0000000000400274 0000000000400274 00000274 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
3 .gnu.hash 00000068 0000000000400298 0000000000400298 00000298 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .dynsym 00000198 0000000000400300 0000000000400300 00000300 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
5 .dynstr 000000b7 0000000000400498 0000000000400498 00000498 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
6 .gnu.version 00000022 0000000000400550 0000000000400550 00000550 2**1
CONTENTS, ALLOC, LOAD, READONLY, DATA
7 .gnu.version_r 00000040 0000000000400578 0000000000400578 00000578 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
8 .rela.dyn 00000180 00000000004005b8 00000000004005b8 000005b8 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
9 .init 0000001a 0000000000400738 0000000000400738 00000738 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
10 .plt 00000010 0000000000400760 0000000000400760 00000760 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
11 .plt.got 00000070 0000000000400770 0000000000400770 00000770 2**3
CONTENTS, ALLOC, LOAD, READONLY, CODE
12 .text 000002d2 00000000004007e0 00000000004007e0 000007e0 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
13 .fini 00000009 0000000000400ab4 0000000000400ab4 00000ab4 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
14 .rodata 00000033 0000000000400ac0 0000000000400ac0 00000ac0 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
15 .eh_frame_hdr 00000044 0000000000400af4 0000000000400af4 00000af4 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
16 .eh_frame 00000134 0000000000400b38 0000000000400b38 00000b38 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
17 .init_array 00000008 0000000000600da0 0000000000600da0 00000da0 2**3
CONTENTS, ALLOC, LOAD, DATA
18 .fini_array 00000008 0000000000600da8 0000000000600da8 00000da8 2**3
CONTENTS, ALLOC, LOAD, DATA
19 .jcr 00000008 0000000000600db0 0000000000600db0 00000db0 2**3
CONTENTS, ALLOC, LOAD, DATA
20 .dynamic 000001c0 0000000000600db8 0000000000600db8 00000db8 2**3
CONTENTS, ALLOC, LOAD, DATA
21 .got 00000088 0000000000600f78 0000000000600f78 00000f78 2**3
CONTENTS, ALLOC, LOAD, DATA
22 .data 00000010 0000000000601000 0000000000601000 00001000 2**3
CONTENTS, ALLOC, LOAD, DATA
23 .bss 00000020 0000000000601010 0000000000601010 00001010 2**4
ALLOC
24 .comment 00000035 0000000000000000 0000000000000000 00001010 2**0
CONTENTS, READONLY
์ด ๋ Partial RELRO๋ .got์ .got.plt๋ก ์กด์ฌํ๋๋ฐ ๊ฐ๊ฐ์ ์ฐจ์ด์ ์ ์๋์ ๊ฐ๋ค.
.got๋ ์คํ๋๋ ์์ ์ Lazy Binding๋๋ ๋ณ์๊ฐ ์์นํ๋ ๊ณณ์ด๋ค..got.plt๋ ์คํ ์ค์ Lazy Binding๋๋ ๋ณ์๊ฐ ์์นํ๋ ๊ณณ์ด๋ค..init_array์ .fini_array์ ๋ํ ๊ถํ์ด ์ ๊ฑฐ๋์ด ์์ง๋ง, .got.plt ์์ญ์ ๋ํ ์ฐ๊ธฐ ๊ถํ์ด ์กด์ฌํ๋ฏ๋ก GOT Overwrite ๊ณต๊ฒฉ์ ํ์ฉํ ์ ์๋ค..init_array,.fini_array,.got ์์ญ ๋ชจ๋ ์ฐ๊ธฐ ๊ถํ์ด ์ ๊ฑฐ๋์ด ์๊ธฐ ๋๋ฌธ์ hook ํจ์๋ฅผ ์ด์ฉํ๋ค. __malloc_hook๊ณผ __free_hook์ด ๋ํ์ ์ธ hook ํจ์๋ก ์ด๋ฌํ hook์ ์ฌ์ฉํ์ฌ ๊ณต๊ฒฉํ๋ ๊ธฐ๋ฒ์ Hook Overwrite๋ผ๊ณ ํ๋ค.์ถ๊ฐ์ ์ผ๋ก ํ์ธํ ์ฌํญ
Hook Overwrite ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ hook ๋ณ์๋ค์ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์์ ์์ ์ฑ ๋ฌธ์ ์ ๋ณด์ ์ทจ์ฝ์ ์ผ๋ก ์ธํด glibc 2.32 ๋ฒ์ ์์ ์ฌ์ฉ์ด ๊ถ์ฅ๋์ง ์๊ฒ ๋์์ผ๋ฉฐ, glibc 2.34 ๋ฒ์ (2021๋
8์ ๋ฆด๋ฆฌ์ค)๋ถํฐ๋ ์์ ํ ์ ๊ฑฐ๋์๋ค๊ณ ํ๋ค.
์ด๋ฌํ ๋ณํ๋ก ์ธํด, ๊ธฐ์กด์ malloc hook์ ์ฌ์ฉํ๋ ๋๋ฒ๊น
๊ธฐ๋ฅ๋ค์ ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ libc_malloc_debug.so.0๋ก ๋ถ๋ฆฌ๋์์ต๋๋ค. ๋ฐ๋ผ์ glibc 2.34 ๋ฒ์ ์ดํ๋ถํฐ๋ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ช
์์ ์ผ๋ก ๋ก๋ํ์ฌ์ผ๋ง ์ด์ ์ ๋๋ฒ๊น
๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค๊ณ ํ๋ค.