์คํ ์ค๋ฒํ๋ก์ฐ VS ์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ ์คํ ์ค๋ฒํ๋ก์ฐ : ์คํ์์ญ์ด ๋๋ฌด ๋ง์ด ํ์ฅ๋ผ์ ๋ฐ์ํ๋ ๋ฒ๊ทธ ์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ : ์คํ์ ์์นํ ๋ฒํผ์ ๋ฒํผ์ ํฌ๊ธฐ๋ณด๋ค ๋ง์ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฅ๋์ด ๋ฐ์ํ๋ ๋ฒ๊ทธ (์คํ์ ๋ฒํผ์์ ๋ฐ์ํ๋ ์ค๋ฒํ๋ก์ฐ) ๋ฒํผ(buffer)๋? ๋ฐ์ดํฐ๊ฐ ๋ชฉ์ ์ง๋ก ์ด๋๋๊ธฐ ์ ์ ๋ณด๊ด๋๋ ์์ ์ ์ฅ์ ์คํ ๋ฒํผ : ์คํ์ ์๋ ์ง์ญ๋ณ์ ํ ๋ฒํผ : ํ์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ Ex1) ๋ฐ์ดํฐ ๋ณ์กฐ - ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ก ์ธํด ๋ค์ ๋ฐ์ดํฐ ๊ฐ์ ๋ณ์กฐ์ํฌ ์ ์๋ค. Ex2) ๋ฐ์ดํฐ ์ ์ถ c์ธ์ด์์ ๋ฌธ์์ด์ ๋์ null๋ก ์ธ์ํ๋๋ฐ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ฅผ ํตํด null์ ์์ ์ฃผ๋ฉด ๋ค์ ๋ฐ์ดํฐ๊น์ง ํจ๊ป ์ฝ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ง๋ค. Ex3) ์คํํ๋ฆ์กฐ์ ์๋ฅผ ๋ค๋ฉด ํจ์์ ret์ ์์ ์ด ์คํํ๊ณ ์ถ์ ๋ช ๋ น..
์ ธ์ฝ๋๋? -> ์ต์คํ๋ก์์ ์ํด ์ ์๋ ์ด์ ๋ธ๋ฆฌ ์ฝ๋ ์กฐ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ ธ์ ํ๋ํ๋ ๊ฒ์ด ๋ชฉ์ ! ์ด์ ๋ธ๋ฆฌ์ด๋ก ์ด๋ฃจ์ด์ ธ์์ Ex) ํด์ปค๊ฐ rip๋ฅผ ์์ ์ด ์์ฑํ ์ ธ์ฝ๋๋ก ์ฎ๊ธฐ๋ฉด ํด์ปค๊ฐ ์ํ๋ ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ฅผ ์คํํ ์ ์์ orw ์ ธ์ฝ๋ ์์ฑ - ํ์ผ์ ์ด๊ณ ์ฝ์ ๋ค ํ๋ฉด์ ์ถ๋ ฅํด์ฃผ๋ ์ ธ์ฝ๋! /** * /tmp/flag๋ฅผ ์ฝ๋ ์ ธ์ฝ๋ */ char buf[0x30]; int fd = open("/tmp/flag", RD_ONLY, NULL); read(fd, buf, 0x30); // ํ์ผ ์ฝ๊ณ buf์ ์ ์ฅ write(1, buf, 0x30); // buf ์ ์๋ ๊ฐ write ์๋ ์ฐ๋ฆฌ๊ฐ ๋ง๋ค ์ ธ ์ฝ๋์ c์ธ์ด ์์ฌ์ฝ๋ 1. int fd = open(“/tmp/flag”, O_RDONLY, NUL..
1. process & remote - process : ์ต์คํ๋ก์์ ๋ก์ปฌ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋์์ผ๋ก ํ ๋ ์ฌ์ฉํ๋ ํจ์ (ํ ์คํธ & ๋๋ฒ๊น ์ฉ) - remote : ์๊ฒฉ ์๋ฒ๋ฅผ ๋์์ผ๋ก ํ ๋ ์ฌ์ฉ (์๋ฒ๋ฅผ ์ค์ ๊ณต๊ฒฉํ๊ธฐ ์ํจ) from pwn import * p = process('./test') #๋ก์ปฌ ๋ฐ์ด๋๋ฆฌ 'test'๋ฅผ ๋์์ผ๋ก ์ต์คํ๋ก์ ์ํ p = remote('example.com',31337) #'example.com'์ 31337 ํฌํธ์์ ์คํ ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ๋์์ผ๋ก ์ต์คํ๋ก์ ์ํ 2. send - send : ๋ฐ์ดํฐ๋ฅผ ํ๋ก์ธ์ค์ ์ ์กํ๊ธฐ์ํด ์ฌ์ฉ from pwn import * p = process('./test') p.send('A') # ./test์ 'A'๋ฅผ ์ ๋ ฅ p.sendli..
gdb๋ ๋ฆฌ๋ ์ค์ ๋ํ์ ์ธ ๋๋ฒ๊ฑฐ์ค ํ๋! ELF - ๋ฆฌ๋ ์ค ์คํ ํ์ผ ํ์ - ํฌ๊ฒ ํค๋์ ์ฌ๋ฌ ํ์์ผ๋ก ์ด๋ฃจ์ด์ง --> ELF ์ ํค๋์ ์ง์ ์ (EP) ํ๋ ์กด์ฌ (OS๋ ELF๋ฅผ ์คํํ ๋ EP๋ถํฐ ํ๋ก๊ทธ๋จ ์คํ) //ํด๋น ๋ช ๋ น์ด๋ฅผ ํตํด ์ง์ ์ ํ์ธ ๊ฐ๋ฅ //entry point address readelf -h debugee(ํ์ผ๋ช ) entry point address : 0x1060 gdb์์ start ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด ์ง์ ์ ์ฃผ์๋ฅผ rip๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค. gdb (gdb) start 1. registers : ๋ ์ง์คํฐ์ ์ํ๋ฅผ ๋ณด์ฌ์ค 2. disasm : rip๋ถํฐ ์ฌ๋ฌ์ค์ ๊ฑธ์ณ ๋์ค์ด์ ๋ธ(๊ธฐ๊ณ์ด -> ์ด์ ๋ธ๋ฆฌ)๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค 3. stack : rsp๋ถํฐ ์ฌ๋ฌ์ค์ ๊ฑธ์ณ..
dreamhack์ ํตํด ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ ํฌ์คํธ์ ๋๋ค. ํผ์ฐ์ฐ์ ์ข ๋ฅ - ์์ - ๋ ์ง์คํฐ - ๋ฉ๋ชจ๋ฆฌ (BYTE(1), WORD(2), DWORD(4), QWORD(8)) ๋ฐ์ดํฐ์ ์ด๋ - MOV a, b => b์ ์๋ ๊ฐ์ a์ ๋์ - LEA a,b => b์ ์ฃผ์๊ฐ์ a์ ๋์ EX) mov eax, dword ptr ss:[ebp-4] ์ ๊ฒฝ์ฐ์๋ [ebp-4]๊ฐ ํ๋์ ์ฃผ์๋ก ํด๋น ์ฃผ์์ ๊ฐ์ eax์ ๋์ ํ๋ค. lea eax, dword ptr ss:[ebp-4] ์ ๊ฒฝ์ฐ์๋ mov eax, ebp ํ์ sub eax,4 ๋ฅผ ํ๋ ๊ฒ๊ณผ ๊ฐ๋ค. +) [ ] ๊ธฐํธ๋ ์ฃผ์์ ์ฐธ์กฐ๊ฐ์ ์๋ฏธํ๋ฉฐ [ ] ์์์ ์ฃผ์์ ์ฌ์น ์ฐ์ฐ์ด ์ด๋ฃจ์ด์ง๋ค. ์ฐ์ ์ฐ์ฐ - add a,b => a= a+b - sub..
ํ๋กค๋ก๊ทธ(์์ ๋ถ๋ถ) 1. main()์์ ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋ณต๊ท์ฃผ์, ์ฆ RET๋ฅผ ์คํ์ ์ ์ฅํ๋ค. 2. ์ด์ ํจ์์ ์คํ์ ์์์ (ebp)๋ฅผ ์คํ์ ์ ์ฅํ๋ค. ํต์์ ์ผ๋ก SFP ๋ผ๊ณ ๋ง์ด ๋ถ๋ฆฐ๋ค. ์ด๋ ํจ์๊ฐ ๋๋๊ณ ๋ค์ ๋์๊ฐ ๋ ์คํ์ ์จ์ ํ ๋ณต๊ตฌํ๊ธฐ ์ํจ์ด๋ค. 3. ebp๋ฅผ esp๊ฐ ์๋ ์์น๋ก ์ด๋์ํจ๋ค. 4. ์ง์ญ๋ณ์ ํ ๋น ๋ฑ ์คํ์ ๊ธฐ๋ฅ ์ํ ์ํ๋ก๊ทธ 1. esp๋ฅผ ebp์์น๋ก ๋ณด๋ธ๋ค. (์ง์ญ๋ณ์ ์ญ์ /pop) 2. pop ebp => ์คํ์ ๊ผญ๋๊ธฐ ๊ฐ์ ebp์ ์ง์ด๋ฃ๋๋ค. => ์ด์ ํจ์์ ebp 3. pop eip => ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ RET๋ก ๋๊ธด๋ค. (eip๋ ๋ค์ ์คํํ ๋ช ๋ น์ด๋ฅผ ๋ด๋ ๋ ์ง์คํฐ) ์ฐธ๊ณ : ARGOS ์์คํ ํดํน ๊ต์ก์๋ฃ
rax rbx rcx rdx rsi rdi rbp r8 r9 r10 r11 r12 r13 r14 r15 rsp rip ๋ฒ์ฉ ๋ ์ง์คํฐ ์ฉ๋๊ฐ ํน๋ณํ๊ฒ ์ ํด์ง์ง ์์ ๋ ์ง์คํฐ๋ก, ๋ณ์์ ๊ฐ์ ์ญํ ์ ํ๋ค. ์ฉ๋๊ฐ ์ ํด์ ธ ์์ง ์์ง๋ง ๋์ ๋ฐ๋ผ ๊ทธ ์ฐ์์๊ฐ ์ ํด์ ธ ์๋ ๊ฒฝ์ฐ๋ ์กด์ฌ (rax๋ ํจ์ ๋ฆฌํด๊ฐ rsi๋ ํจ์ ํ๋ผ๋ฉํฐ) ํจ์ ํธ์ถ ๊ท์ฝ ํจ์๊ฐ ์คํ๋ ๋ ํ์ํ ์ธ์๋ค์ ์ ์ฅํ๋ ๋ ์ง์คํฐ๋ ์กด์ฌํ๋ค. (rdi rsi rcx rdx ...) ์คํํฌ์ธํฐ ์คํ์ ๊ฐ์ฅ ์์ชฝ์ ๊ฐ๋ฆฌํจ๋ค. ์คํ์ ํจ์๊ฐ ์ฌ์ฉํ ์ง์ญ ๋ณ์๋ค์ ์ ์ฅํ๊ธฐ ์ํด ์ค๋นํด๋์ ๊ณต๊ฐ์ด๋ค. (rsp) ํ๋ก๊ทธ๋จ ์นด์ดํฐ rip๋ ํ๋ก๊ทธ๋จ์นด์ดํฐ์ ์ญํ ์ ํ๋ค. ํ๋ก๊ทธ๋จ ์นด์ดํฐ๋ ๋ค์์ ์คํ๋ ๋ช ๋ น์ด๊ฐ ์์นํ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํจ๋ค. mov a, b b๋ฅผ ..
์ด๋ฒ์ ๋์๋ฆฌ ๊ต์ก์์ ๋ฒํผ์ค๋ฒํ๋ก์ฐ์ ๋ํด ๋ฐฐ์ ๋ค. ๊ธฐ๋ณธ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ ์ฃผ์ด์ง ์์ญ์ ๋์ด ๊ฐ์ ๋ ๋ฃ์ ์ ์๊ฒ ๋๋ ์ทจ์ฝ์ Ex) getsํจ์๋ ์ ๋ ฅ๊ฐ์ ๊ณ์ํด์ ๋ฐ์ ์ ์๊ณ ๊ฐ๊ฐ์ ๋ณ์๋ค์ ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋์ด์๊ธฐ ๋๋ฌธ์ bof์ ๋ํ ์ ๋ ฅ์ ํฌ๊ธฐ 4์ด์์ผ๋ก ์ ๋ ฅํ์๋ target์ ๊ฐ์ผ๋ก ์นจ๋ฒํ๊ฒ ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ๋ฒํผ์ค๋ฒํ๋ก์ฐ์ด๋ค. (๋ณ์๋ค์ ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋น๋๋๋ฐ ์ด ์์๋ ๋ฐ์ดํธ ํฌ๊ธฐ์์ธ๊ฐ??) ์ฐธ๊ณ : ARGOS ์์คํ ํดํน ๊ต์ก์๋ฃ
์ด์ ๋ธ๋ฆฌ์ด ๊ธฐ๊ณ์ด์ ์ผ๋์ผ ๋์๋๋ ์ธ์ด. ์คํํ์ผ๋ง ์์ด๋ ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ฅผ ๋ณผ ์ ์๋ค. ์ด์ง์๋ก ๋ ๊ธฐ๊ณ์ด๋ฅผ "๋์ปดํ์ผ๋ฌ" ๋ฅผ ์ด์ฉํ์ฌ ์ด์ ๋ธ๋ฆฌ์ด๋ก ๋ ์ฝ๋๋ฅผ ์ป์ด๋ด๊ณ , ์ด๋ฅผ ๋ถ์ํ๋ค. ๋๋ฒ๊ฑฐ GDB(GNU Debugger) C, C++ ๋ฑ์ผ๋ก ๋ง๋ค์ด์ง ์คํ ํ์ผ์ ๋๋ฒ๊น ํ๋ ๋๊ตฌ 1. ์์/์ข ๋ฃ ์์: gdb [ํ๋ก๊ทธ๋จ๋ช ] ์ข ๋ฃ: quit or q 2. ๋ฌธ๋ฒ ๋ณ๊ฒฝ set disassembly-flavor intel 3. ๋ถ์ ํด๋น ํจ์ ์ฝ๋: disas [ํจ์์ด๋ฆ] ์คํ : run or r ๋ธ๋ ์ดํฌ ํฌ์ธํธ : b [์ง์ ] ๋ธ๋ ์ดํฌ ํฌ์ธํธ ๊ฑธ๋ฆฐ ์์น ์ฝ๋ : disas ๋ธ๋ ์ดํฌ ํฌ์ธํธ ๋ค ์ง์ฐ๊ธฐ: d or dis ๋ค์ ๋ช ๋ น์ด : ni ์งํ : c ๊ฐ์ ์ ํ : jump [์์น] -> ํจ์, ํ, ๋ฉ๋ชจ..