detached entity passed to persist ๊ด๋ จ ์๋ฌ๊ฐ ๋จ๋ ๊ฒฝ์ฐ ์ด๋ฏธ ์์ฑ๋์ด ์๋ ๊ฐ์ฒด์ ๋ถ๋ถ์ ๋ค์ ํ๋ฒ ๋ ์ค์ ์ ํด์ฃผ๊ฑฐ๋ ์ ์ฅ์ ํด์ฃผ๋ ค๊ณ ํ ๋ ์๊ธฐ๋ ๊ฒ! ์ฆ, ์ํฐํฐ ์ข ์์ฑ ๋ฌธ์ ๊ฑฐ๋ ๊ฐ์ฒด ์์ฑํ ๋ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ !! ์๋ฅผ ๋ค๋ฉด 1) id ํ๋์ @GeneratedValue๋ฅผ ์ฌ์ฉํด์ ์๋์ผ๋ก ๋ง๋ค์ด์ง๋๋ก ํด๋๊ณ ํ ์คํธํ ๋ id ๊ฐ์ ์ค์ ํด์คฌ๋ค๋๊ฐ.. 2) ์ํฐํฐ๋ค์ ์ฐ๊ด๊ด๊ณ๊ฐ ์กด์ฌํ ๋ ํด๋์คA ์ a1, a2 ์ ์ฐ๊ด๋ ํด๋์คB์ b1 ์ด ์์ ๋ (a1 + b1) ์ ์ฅํ๊ณ (a2 + b1) ์ ์ฅ๋์ด ์ค๋ณต์ผ๋ก ์ ์ฅ๋๋ ๊ฒฝ์ฐ (์ด๋ฐ ๊ฒฝ์ฐ์๋ cascade ๊ด๋ จํด์ ์ค์ ์ ์ ๊ฑฐํด์ฃผ๋๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๊ฒ ํด์ฃผ๋ฉด ๋ ๋ฏ!)
JWT๋? Json Web Token ์ ์ฝ์๋ก json ๊ฐ์ฒด์ ์ฌ์ฉ์์ ์ผ๋ถ ์ ๋ณด๋ฅผ ๋ด๋๋ค. ์ธ์ ๊ณผ ๋ฌ๋ฆฌ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๊ฐ ์ค ํ ํฐ์ ๊ฐ์ง๊ณ ์๋ค๊ฐ ํค๋์ ์ค์ด์ ๋ณด๋ด๋ ๋ฐฉ์ (๋จ์ํ๊ฒ ๋งํ๋ฉด ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ๋ฐฉ์) Header : Signature๋ฅผ ํด์ฑํ๊ธฐ ์ํ ์๊ณ ๋ฆฌ์ฆ ์ ๋ณด๋ค ๋ด๊ฒจ์์ Payload : ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ์ฃผ๊ณ ๋ฐ๋, ์์คํ ์์ ์ค์ ๋ก ์ฌ์ฉ๋ ์ ๋ณด๋ค์ ๋ํ ๋ด์ฉ ๋ด๊ณ ์์ Signature : ํ ํฐ์ ์ ํจ์ฑ ๊ฒ์ฆ์ ์ํ ๋ฌธ์์ด (์ ํจํ ํ ํฐ์ธ์ง ๊ฒ์ฆ) ์ธ์ ์? ์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ์ธ์ฆํ ์ ์ ์ ์ ๋ณด๋ฅผ ์ ์ฅํด๋ ! ๊ทธ๋ฆฌ๊ณ ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ฆ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ํต์ ํ๋ ๋ฐฉ์ stateful service๋ ์ธ์ ์ ๋ณด๋ฅผ ์๋ฒ์ ์ ์ฅํ๊ณ ์ธ์ ์ํ์ ๋ฐ๋ฅธ ์๋ต์ ์ฃผ๋ ์๋น์ค! -> EX) ์ธ์ ..
pip install djangorestframework-simplejwt settings.py simple-jwt ํ๋ ์์ํฌ ์ฌ์ฉ๊ณผ ๊ถํ ๊ด๋ฆฌ๋ฅผ ์ํด settings.py ์์ ๋ค์๊ณผ ๊ฐ์ด ์ถ๊ฐํด์ค๋ค. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ) } ์ปค์คํ ์ ์ ๋ชจ๋ธ์ ์ฌ์ฉ ๋ฐ simple-jwt ์ถ๊ฐ ์ต์ ์ ์ฃผ๊ธฐ ์ํด ๋ค์๋ ์ถ๊ฐํ๋ค. AUTH_USER_MODEL = "์ฑ์ด๋ฆ.CustomUser..
ํ์ด๋ ? ์์ฒญ์ ๋ฐ๋ผ ํ ๋น๋๋ฉฐ 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..
django-admin startproject tutorial # ์ฅ๊ณ ํ๋ก์ ํธ ์์ฑ cd tutorial # ๋ฃจํธ ํ๋ก์ ํธ๋ก ์ด๋ ./manage.py startapp community # ์ฑ ์์ฑ ./manage.py migrate # ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ ./manage.py createsuperuser # ๊ด๋ฆฌ์ ์์ฑ ./manage.py runserver {port} # ์๋ฒ ์ฐ๊ฒฐ settings.py์ community ์ฑ ์ถ๊ฐํด์ฃผ์ด์ผํจ INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.message..
์ฑ ์ ๋ณด๊ณ ๊ณต๋ถํ ๋ด์ฉ์ ๋๋ค 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("..