์ฑ… ๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

**์ €์ž ํ•ต์‹ฌ ๋ช…์ œ**: ํ•ดํ‚น์€ ์ œ์•ฝ์„ ์ฐฝ์˜์ ์œผ๋กœ ๊ทน๋ณตํ•˜๋Š” ์˜ˆ์ˆ ์ด๋‹ค. ์‹œ์Šคํ…œ์„ ์ดํ•ดํ•˜๊ณ  ํ—ˆ์šฉ๋œ ๊ฒƒ ์ด์ƒ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ํ–‰์œ„ โ€” ๋…ผ๋ฆฌ๊ฐ€ ์˜ˆ์ˆ  ํ˜•์‹์ด ๋˜๋Š” ์„ธ๊ณ„.

์ด ๋งํฌ๋ฅผ ํ†ตํ•ด ๊ตฌ๋งคํ•˜๋ฉด ์šด์˜์ž์—๊ฒŒ ์†Œ์ •์˜ ์ˆ˜์ˆ˜๋ฃŒ๊ฐ€ ์ง€๊ธ‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

YES24์—์„œ ๊ตฌ๋งคํ•˜๊ธฐ

Hacking: The Art of Exploitation, 2nd Ed. โ€” Jon Erickson (No Starch Press, 2008)

์ €์ž ํ•ต์‹ฌ ๋ช…์ œ: ํ•ดํ‚น์€ ์ œ์•ฝ์„ ์ฐฝ์˜์ ์œผ๋กœ ๊ทน๋ณตํ•˜๋Š” ์˜ˆ์ˆ ์ด๋‹ค. ์‹œ์Šคํ…œ์„ ์ดํ•ดํ•˜๊ณ  ํ—ˆ์šฉ๋œ ๊ฒƒ ์ด์ƒ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ํ–‰์œ„ โ€” ๋…ผ๋ฆฌ๊ฐ€ ์˜ˆ์ˆ  ํ˜•์‹์ด ๋˜๋Š” ์„ธ๊ณ„.

  • ์ถœํŒ: No Starch Press, 2008 / ISBN: 978-1-59327-144-2
  • ๊ตฌ์„ฑ: 7๊ฐœ ์ฑ•ํ„ฐ (0x100~0x700), LiveCD ํฌํ•จ
  • ํฌ์ปค์Šค: ์ด๋ก  + ์ง์ ‘ ์ฝ”๋“œ๋กœ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ์ฆ๋ช… โ€” "๊ธฐ๋ฒ•์„ ์“ฐ๋Š” ๋ฒ•"์ด ์•„๋‹ˆ๋ผ "์™œ ์ž‘๋™ํ•˜๋Š”๊ฐ€"

์ฑ•ํ„ฐ ๊ตฌ์„ฑ ๊ฐœ์š”

์ฑ•ํ„ฐ์ œ๋ชฉํ•ต์‹ฌ ์ฃผ์ œ
0x100Introductionํ•ด์ปค ์œค๋ฆฌ, ํ•ด์ปค vs ํฌ๋ž˜์ปค vs ์Šคํฌ๋ฆฝํŠธ ํ‚ค๋””
0x200ProgrammingC, x86 ์–ด์…ˆ๋ธ”๋ฆฌ, GDB, ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ
0x300Exploitation๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ, ํฌ๋งท ์ŠคํŠธ๋ง, ํž™ยทBSS ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ
0x400Networkingraw ์†Œ์ผ“, TCP/IP, DoS, TCP ํ•˜์ด์žฌํ‚น
0x500Shellcodex86 ์…ธ์ฝ”๋“œ ์ž‘์„ฑ, ํฌํŠธ ๋ฐ”์ธ๋”ฉ, null-byte ํšŒํ”ผ
0x600CountermeasuresASLR, ์Šคํƒ ์นด๋‚˜๋ฆฌ, NX, ์šฐํšŒ ๊ธฐ๋ฒ•
0x700Cryptology๋Œ€์นญ/๋น„๋Œ€์นญ ์•”ํ˜ธ, RSA, ์–‘์ž ์ปดํ“จํŒ… ํ•จ์˜

0x100: ์„œ๋ก  โ€” ํ•ด์ปค ์œค๋ฆฌ์™€ ์ •์˜

ํ•ต์‹ฌ ๊ฐœ๋…

ํ•ด์ปค ์œค๋ฆฌ (Hacker Ethic):

  • ์ •๋ณด์˜ ์ž์œ ๋กœ์šด ํ๋ฆ„์„ ๋ฏฟ์Œ
  • ์‹œ์Šคํ…œ ํƒ๊ตฌ ์ž์ฒด์— ๊ฐ€์น˜๋ฅผ ๋‘ 
  • ๋…ผ๋ฆฌ๋ฅผ ์˜ˆ์ˆ  ํ˜•์‹์œผ๋กœ ๋ด„

์„ธ ๊ฐ€์ง€ ๊ตฌ๋ถ„:

์šฉ์–ด์˜๋ฏธ
ํ•ด์ปค(Hacker)์‹œ์Šคํ…œ ์ดํ•ด์™€ ์ฐฝ์˜์  ๋ฌธ์ œ ํ•ด๊ฒฐ. ๋ฐ˜๋“œ์‹œ ์•…์˜์ ์ด์ง€ ์•Š์Œ
ํฌ๋ž˜์ปค(Cracker)์•…์˜์  ๋ชฉ์ ์œผ๋กœ ์‹œ์Šคํ…œ์— ์นจ์ž…ํ•˜๋Š” ์‚ฌ๋žŒ
์Šคํฌ๋ฆฝํŠธ ํ‚ค๋””(Script Kiddie)์ดํ•ด ์—†์ด ๋‚จ์˜ ๋„๊ตฌ๋งŒ ์‚ฌ์šฉ

๊ณต์ง„ํ™” ๋ชจ๋ธ (Co-evolutionary Model):

  • ๋ณด์•ˆ์€ ๊ตฐ๋น„ ๊ฒฝ์Ÿ โ€” ๊ณต๊ฒฉ์ž๊ฐ€ ๋ฐฉ์–ด๋ฅผ ๊ฐœ์„ ํ•˜๊ณ , ๋ฐฉ์–ด์ž๊ฐ€ ๊ณต๊ฒฉ์„ ์ œํ•œํ•จ
  • "๋ฐฉ์–ด๋Š” ๊ณต๊ฒฉ์„ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค"๋Š” ์ฑ…์˜ ๊ทผ๋ณธ ์ „์ œ

0x200: ํ”„๋กœ๊ทธ๋ž˜๋ฐ โ€” ์ต์Šคํ”Œ๋กœ์ž‡์˜ ํ† ๋Œ€

x86 ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

๋ฉ”๋ชจ๋ฆฌ ์„ธ๊ทธ๋จผํŠธ:

๋‚ฎ์€ ์ฃผ์†Œ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ๋†’์€ ์ฃผ์†Œ
[ํ…์ŠคํŠธ] [๋ฐ์ดํ„ฐ] [BSS] [ํž™โ†’] [โ†์Šคํƒ]
์„ธ๊ทธ๋จผํŠธ๋‚ด์šฉ
ํ…์ŠคํŠธ(Text)์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ
๋ฐ์ดํ„ฐ(Data)์ดˆ๊ธฐํ™”๋œ ์ •์  ๋ณ€์ˆ˜
BSS์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ •์  ๋ณ€์ˆ˜
ํž™(Heap)malloc() ๋“ฑ ๋™์  ํ• ๋‹น. ๋‚ฎโ†’๋†’ ๋ฐฉํ–ฅ์œผ๋กœ ์„ฑ์žฅ
์Šคํƒ(Stack)์ง€์—ญ ๋ณ€์ˆ˜ยท๋ฆฌํ„ด ์ฃผ์†Œ. ๋†’โ†’๋‚ฎ ๋ฐฉํ–ฅ์œผ๋กœ ์„ฑ์žฅ

ํ•ต์‹ฌ ๋ ˆ์ง€์Šคํ„ฐ (x86):

๋ ˆ์ง€์Šคํ„ฐ์—ญํ• 
EIP๋ช…๋ น ํฌ์ธํ„ฐ โ€” ๋‹ค์Œ ์‹คํ–‰ํ•  ๋ช…๋ น์˜ ์ฃผ์†Œ
EBPํ”„๋ ˆ์ž„ ๋ฒ ์ด์Šค ํฌ์ธํ„ฐ โ€” ํ˜„์žฌ ์Šคํƒ ํ”„๋ ˆ์ž„ ๊ธฐ์ค€์ 
ESP์Šคํƒ ํฌ์ธํ„ฐ โ€” ์Šคํƒ ์ตœ์ƒ๋‹จ ๊ฐ€๋ฆฌํ‚ด

๋ฆฌํ‹€-์—”๋””์–ธ ๋ฐ”์ดํŠธ ์ˆœ์„œ: x86์€ ๊ฐ€์žฅ ๋‚ฎ์€ ๋ฐ”์ดํŠธ๊ฐ€ ๋‚ฎ์€ ์ฃผ์†Œ์— ์ €์žฅ. 0x12345678 โ†’ ๋ฉ”๋ชจ๋ฆฌ์— 78 56 34 12 ์ˆœ์„œ.

์Šคํƒ ํ”„๋ ˆ์ž„ ๊ตฌ์กฐ

ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์Šคํƒ์— ์Œ“์ด๋Š” ์ˆœ์„œ:

๋†’์€ ์ฃผ์†Œ
    [ํ•จ์ˆ˜ ์ธ์ˆ˜]
    [๋ฆฌํ„ด ์ฃผ์†Œ (EIP ์ €์žฅ๊ฐ’)]
    [์ €์žฅ๋œ ํ”„๋ ˆ์ž„ ํฌ์ธํ„ฐ (SFP)]
    [์ง€์—ญ ๋ณ€์ˆ˜ ...]
๋‚ฎ์€ ์ฃผ์†Œ  โ† ESP๊ฐ€ ๊ฐ€๋ฆฌํ‚ด

ํ•จ์ˆ˜ ํ”„๋กค๋กœ๊ทธ/์—ํ•„๋กœ๊ทธ:

  • ํ”„๋กค๋กœ๊ทธ: push ebp โ†’ mov ebp, esp โ†’ sub esp, N
  • ์—ํ•„๋กœ๊ทธ: mov esp, ebp โ†’ pop ebp โ†’ ret

GDB ๋””๋ฒ„๊น… ๊ธฐ๋ฒ•

gdb ./ํ”„๋กœ๊ทธ๋žจ
(gdb) break main          # ๋ธŒ๋ ˆ์ดํฌํฌ์ธํŠธ ์„ค์ •
(gdb) run                 # ์‹คํ–‰
(gdb) info registers      # ๋ ˆ์ง€์Šคํ„ฐ ํ™•์ธ
(gdb) x/24x $esp          # ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ ๋คํ”„ (24 DWORD hex)
(gdb) disassemble main    # ์–ด์…ˆ๋ธ”๋ฆฌ ์—ญ์–ด์…ˆ๋ธ”
(gdb) set disassembly-flavor intel  # Intel ๋ฌธ๋ฒ•

0x300: ์ต์Šคํ”Œ๋กœ์ž‡ โ€” ์ทจ์•ฝ์  ๊ณต๊ฒฉ

๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ (Stack-based)

์›๋ฆฌ: ์Šคํƒ์—์„œ ๋ฒ„ํผ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด ์“ฐ๋ฉด ์ธ์ ‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฎ์–ด์”€.

ํ•ต์‹ฌ ์˜ˆ์ œ โ€” auth_overflow.c:

์Šคํƒ ๊ตฌ์กฐ:
[password_buffer 16๋ฐ”์ดํŠธ] [padding] [auth_flag]
                                      โ†‘ 28๋ฐ”์ดํŠธ ์˜คํ”„์…‹
  • 30๊ฐœ์˜ 'A' ์ž…๋ ฅ โ†’ auth_flag๊ฐ€ 0x00004141(=16705)๋กœ ๋ณ€์กฐ โ†’ ์ธ์ฆ ์šฐํšŒ
  • EIP๋ฅผ ๋ฎ์–ด์“ฐ๋ฉด ์ž„์˜ ์ฝ”๋“œ ์‹คํ–‰ ๊ฐ€๋Šฅ

EIP ์ œ์–ด ๊ณผ์ •:

  1. ๋ฒ„ํผ โ†’ SFP โ†’ ๋ฆฌํ„ด ์ฃผ์†Œ ์ˆœ์„œ๋กœ ๋ฎ์–ด์”€
  2. ๋ฆฌํ„ด ์ฃผ์†Œ์— ์…ธ์ฝ”๋“œ ์ฃผ์†Œ ์‚ฝ์ž…
  3. NOP ์Šฌ๋ ˆ๋“œ(0x90)๋กœ ์ฃผ์†Œ ์ •๋ฐ€๋„ ์™„ํ™”

ํž™ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ (Heap-based)

์˜ˆ์ œ โ€” notetaker.c:

  • malloc()์œผ๋กœ ๋…ธํŠธ ํŒŒ์ผ๋ช…๊ณผ ๋‚ด์šฉ์„ ํž™์— ํ• ๋‹น
  • ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ํŠธ๋ฆญ: ๋…ธํŠธ ํŒŒ์ผ โ†’ /etc/passwd๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•จ
  • ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋กœ ํŒŒ์ผ๋ช… ํฌ์ธํ„ฐ๋ฅผ ๋ฎ์–ด์”€ โ†’ root ๊ถŒํ•œ ํŒŒ์ผ ์“ฐ๊ธฐ

BSS ์„ธ๊ทธ๋จผํŠธ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ

์˜ˆ์ œ โ€” game_of_chance.c:

static char name[100];             // BSS์— ์œ„์น˜
static void (*current_game)();     // ํ•จ์ˆ˜ ํฌ์ธํ„ฐ (name 100๋ฐ”์ดํŠธ ๋’ค)
  • name ๋ฒ„ํผ๋ฅผ 100๋ฐ”์ดํŠธ ์ด์ƒ ์ฑ„์šฐ๋ฉด current_game ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ๋ฎ์–ด์”€
  • 0x42424242 ์ฃผ์†Œ๋กœ ์ ํ”„ โ†’ BBBB ์‹คํ–‰

ํฌ๋งท ์ŠคํŠธ๋ง ์ทจ์•ฝ์ 

์›์ธ: printf(user_input) โ€” ํฌ๋งท ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์–ด.

์ฃผ์š” ๊ณต๊ฒฉ ๋ฒกํ„ฐ:

ํฌ๋งทํšจ๊ณผ
%x์Šคํƒ ๊ฐ’ 16์ง„์ˆ˜ ์ถœ๋ ฅ โ†’ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์šฉ ๋…ธ์ถœ
%s์Šคํƒ์˜ ์ฃผ์†Œ๋ฅผ ํฌ์ธํ„ฐ๋กœ ํ•ด์„, ๋ฌธ์ž์—ด ์ฝ๊ธฐ โ†’ ์ž„์˜ ์ฃผ์†Œ ์ฝ๊ธฐ
%n์ง€๊ธˆ๊นŒ์ง€ ์ถœ๋ ฅํ•œ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ์Šคํƒ ์ฃผ์†Œ์— ์”€ โ†’ ์ž„์˜ ์ฃผ์†Œ ์“ฐ๊ธฐ

์ž„์˜ ์ฃผ์†Œ ์“ฐ๊ธฐ ๊ธฐ๋ฒ•:

  • ํฌ๋งท ๋ฌธ์ž์—ด ์•ž์— ๋ชฉํ‘œ ์ฃผ์†Œ๋ฅผ 4๋ฐ”์ดํŠธ์”ฉ ์‚ฝ์ž… (4๊ฐœ ์ฃผ์†Œ: addr, addr+1, addr+2, addr+3)
  • field-width ์˜ต์…˜(%NNx)์œผ๋กœ ์ถœ๋ ฅ ๋ฐ”์ดํŠธ ์ˆ˜ ์กฐ์ ˆ โ†’ %n์ด ์“ฐ๋Š” ๊ฐ’ ์ œ์–ด
  • ๊ฐ ๋ฐ”์ดํŠธ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฎ์–ด์“ฐ๋ฉด ์ž„์˜ 32๋น„ํŠธ ๊ฐ’์„ ์ž„์˜ ์ฃผ์†Œ์— ์“ธ ์ˆ˜ ์žˆ์Œ
๊ฒฐ๊ณผ: 4ํšŒ %n ์“ฐ๊ธฐ๋กœ 0xDDCCBBAA๋ฅผ address์— ๊ธฐ๋ก

0x400: ๋„คํŠธ์›Œํ‚น โ€” ํ”„๋กœํ† ์ฝœ ์ดํ•ด์™€ ๊ณต๊ฒฉ

raw ์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  • socket(PF_INET, SOCK_STREAM, 0) โ€” TCP ์†Œ์ผ“ ์ƒ์„ฑ
  • libpcap: ํŒจํ‚ท ์บก์ฒ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • libnet: ํŒจํ‚ท ์ฃผ์ž… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • BPF (Berkeley Packet Filter): ์ปค๋„ ์ˆ˜์ค€ ํŒจํ‚ท ํ•„ํ„ฐ ("dst host x.x.x.x and tcp[tcpflags] & tcp-ack != 0")

DoS ๊ณต๊ฒฉ ์œ ํ˜•

๊ณต๊ฒฉ๋ฉ”์ปค๋‹ˆ์ฆ˜ํ˜„์žฌ ์œ ํšจ์„ฑ
SYN ํ”Œ๋Ÿฌ๋“œ๋žœ๋ค IP๋กœ SYN ํŒจํ‚ท ๋ฒ”๋žŒ โ†’ ์—ฐ๊ฒฐ ํ…Œ์ด๋ธ” ์†Œ์ง„syncookies๋กœ ๋ฐฉ์–ด
Ping of Death65,536๋ฐ”์ดํŠธ ์ดˆ๊ณผ ICMP ํŒจํ‚ท โ†’ ํฌ๋ž˜์‹œ๊ตฌํ˜• OS์—๋งŒ ์œ ํšจ
Teardrop๊ฒน์น˜๋Š” ์˜คํ”„์…‹์˜ IP ๋‹จํŽธ โ†’ ์žฌ์กฐ๋ฆฝ ํฌ๋ž˜์‹œํŒจ์น˜๋จ. ๊ฐœ๋…์€ ๋ฐ˜๋ณต
Smurf/Fraggle๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ์ฆํญ (ICMP/UDP echo)ISP ํ•„ํ„ฐ๋ง์œผ๋กœ ๊ฐ์†Œ
DDoS/๋ด‡๋„ท๊ฐ์—ผ ํ˜ธ์ŠคํŠธ๋“ค์˜ ๋™์‹œ ํ”Œ๋Ÿฌ๋“œํ˜„์žฌ๋„ ์ฃผ์š” ์œ„ํ˜‘

TCP/IP ํ•˜์ด์žฌํ‚น

  • ์กฐ๊ฑด: ๊ณต๊ฒฉ์ž๊ฐ€ ํ”ผํ•ด์ž์™€ ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ์„ธ๊ทธ๋จผํŠธ
  • ๋ฐฉ๋ฒ•: libpcap์œผ๋กœ ์Šค๋‹ˆํ•‘ โ†’ ์‹œํ€€์Šค ๋ฒˆํ˜ธ ํ™•๋ณด โ†’ ํ”ผํ•ด์ž IP ์œ„์žฅ ํŒจํ‚ท ์ „์†ก
  • RST ํ•˜์ด์žฌํ‚น: ์˜ฌ๋ฐ”๋ฅธ ACK ๋ฒˆํ˜ธ๋กœ RST ํŒจํ‚ท ์œ„์žฅ ์ „์†ก โ†’ ์—ฐ๊ฒฐ ๊ฐ•์ œ ์ข…๋ฃŒ

0x500: ์…ธ์ฝ”๋“œ โ€” ๊ธฐ๊ณ„์–ด ์ˆ˜์ค€ ํŽ˜์ด๋กœ๋“œ

execve("/bin/sh") ์…ธ์ฝ”๋“œ

push BYTE 11          ; sys_execve = 11
pop eax
push ecx              ; null terminator
push 0x68732f2f       ; "//sh"
push 0x6e69622f       ; "/bin"
mov ebx, esp          ; ebx = "/bin//sh"
push ecx              ; null for envp
mov edx, esp
push ebx              ; argv[0]
mov ecx, esp
int 0x80              ; execve("/bin//sh", ["/bin//sh", NULL], [NULL])

ํ•ต์‹ฌ ์›์น™:

  • null ๋ฐ”์ดํŠธ(0x00) ํšŒํ”ผ โ€” ๋ฌธ์ž์—ด ๋ณต์‚ฌ ํ•จ์ˆ˜๊ฐ€ null์—์„œ ์ค‘๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ
  • xor eax, eax ๋Œ€์‹  push 0; pop eax ๋“ฑ์œผ๋กœ null ์—†์ด ๋ ˆ์ง€์Šคํ„ฐ ์ดˆ๊ธฐํ™”

ํฌํŠธ ๋ฐ”์ธ๋”ฉ ์…ธ์ฝ”๋“œ

sockfd = socket(PF_INET, SOCK_STREAM, 0);  // socketcall(SYS_SOCKET, args)
bind(sockfd, &addr, sizeof(addr));          // socketcall(SYS_BIND, args)
listen(sockfd, 4);
accept(sockfd, ...);
dup2(new_fd, 0/1/2);  // stdin/stdout/stderr ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
execve("/bin/sh", ...);
  • Linux syscall socketcall (#102): ๋ชจ๋“  ์†Œ์ผ“ ํ•จ์ˆ˜๋ฅผ ๋‹จ์ผ ์ง„์ž…์ ์œผ๋กœ ์ฒ˜๋ฆฌ
  • ํฌํŠธ 31337 ๋ฐ”์ธ๋”ฉ โ†’ ์›๊ฒฉ ์—ฐ๊ฒฐ ์‹œ ์…ธ ํš๋“

ํด๋ฆฌ๋ชจํ”ฝ ํ”„๋ฆฐํ„ฐ๋ธ” ASCII ์…ธ์ฝ”๋“œ

๋ฐฐ๊ฒฝ: ์ž…๋ ฅ ๊ฒ€์ฆ์ด ํ”„๋ฆฐํ„ฐ๋ธ” ๋ฌธ์ž(0x20~0x7e)๋งŒ ํ—ˆ์šฉํ•  ๋•Œ.

ํ•ต์‹ฌ ๊ธฐ๋ฒ•:

  • and eax, 0x41414141 โ†’ %AAAA (ํ”„๋ฆฐํ„ฐ๋ธ” ๊ธฐ๊ณ„์–ด)
  • AND ์—ฐ์‚ฐ์œผ๋กœ ๋ ˆ์ง€์Šคํ„ฐ 0 ์ดˆ๊ธฐํ™”: ๋‘ ์—ญ ๊ฐ’ AND โ†’ ๋ชจ๋‘ 0
  • sub eax, value๋กœ ๋ชฉํ‘œ ๊ฐ’์„ ์ˆœํ™˜ ๋บ„์…ˆ์œผ๋กœ ๊ตฌ์„ฑ
  • push/pop (PยทXยทTยท\)์œผ๋กœ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ„ ์ด๋™
TX-3399-Purr-!TTT-P\  โ†’ ESP์— 860 ๋”ํ•˜๊ธฐ (ํ”„๋ฆฐํ„ฐ๋ธ” ASCII๋งŒ ์‚ฌ์šฉ)
  • ๋กœ๋” ์ฝ”๋“œ๊ฐ€ ์Šคํƒ์— ์‹ค์ œ ์…ธ์ฝ”๋“œ๋ฅผ ๋’ค์—์„œ ์•ž์œผ๋กœ ์กฐ๋ฆฝ โ†’ EIP๊ฐ€ ๋„๋‹ฌ

0x600: ์นด์šดํ„ฐ๋ฉ”์ € โ€” ๋ฐฉ์–ด์™€ ์šฐํšŒ

์ฃผ์š” ๋ณดํ˜ธ ๊ธฐ๋ฒ•

๋ณดํ˜ธ ๊ธฐ๋ฒ•์›๋ฆฌ์šฐํšŒ ๋ฐฉ๋ฒ•
ASLR์Šคํƒยทํž™ยท๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฃผ์†Œ ๋ฌด์ž‘์œ„ํ™”linux-gate ๊ธฐ๋ฒ•, return-to-libc, ๋ธŒ๋ฃจํŠธํฌ์Šค
์Šคํƒ ์นด๋‚˜๋ฆฌ๋ฆฌํ„ด ์ฃผ์†Œ ์•ž์— ๊ฒ€์ฆ๊ฐ’ ์‚ฝ์ž…์นด๋‚˜๋ฆฌ ๊ฐ’ ์œ ์ถœ ํ›„ ๋ฎ์–ด์“ฐ๊ธฐ
NX bit์Šคํƒ/ํž™ ์‹คํ–‰ ๋ถˆ๊ฐ€Return-to-libc (์ฝ”๋“œ ์žฌ์‚ฌ์šฉ)

ASLR ์šฐํšŒ โ€” linux-gate ๋ฐ”์šด์Šค

  • linux-gate.so.1: ์ปค๋„์ด ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์— ๊ฐ™์€ ์ฃผ์†Œ(0xffffe000)๋กœ ๋…ธ์ถœํ•˜๋Š” ๊ฐ€์ƒ ๊ณต์œ  ๊ฐ์ฒด
  • ASLR์ด ์ผœ์ ธ๋„ linux-gate๋Š” ํ•ญ์ƒ ๊ณ ์ • ์ฃผ์†Œ
  • jmp esp (0xff 0xe4) ๋ช…๋ น์ด 0xffffe777์— ์กด์žฌ
  • exploit: ๋ฆฌํ„ด ์ฃผ์†Œ๋ฅผ 0xffffe777๋กœ ๋ฎ์–ด์”€ โ†’ jmp esp ์‹คํ–‰ โ†’ ESP๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์…ธ์ฝ”๋“œ๋กœ ์ ํ”„
EIP ์ œ์–ด โ†’ linux-gate์˜ jmp esp โ†’ ESP์— ๋ฏธ๋ฆฌ ์Œ“์•„๋‘” ์…ธ์ฝ”๋“œ ์‹คํ–‰

(์ด ๊ธฐ๋ฒ•์€ Linux kernel 2.6.18๋ถ€ํ„ฐ ํŒจ์น˜๋จ)

ํด๋ฆฌ๋ชจํ”ฝ ์ธ์ฝ”๋”ฉ ์…ธ์ฝ”๋“œ

  • ์ž…๋ ฅ ๊ฒ€์ฆ์„ ํ†ต๊ณผํ•˜๋Š” ์ธ์ฝ”๋” + ๋Ÿฐํƒ€์ž„ ๋””์ฝ”๋” ์กฐํ•ฉ
  • ๋””์ฝ”๋”๋Š” ์ž์‹ ์ด ์‹คํ–‰๋˜๋ฉด์„œ ์‹ค์ œ ์…ธ์ฝ”๋“œ๋ฅผ ๋ณตํ˜ธํ™”ยท์‹คํ–‰

0x700: ์•”ํ˜ธํ•™

๋Œ€์นญ ์•”ํ˜ธ

  • ๋™์ผํ•œ ํ‚ค๋กœ ์•”ํ˜ธํ™”ยท๋ณตํ˜ธํ™”
  • DES: 56๋น„ํŠธ ํ‚ค, Feistel ๋„คํŠธ์›Œํฌ ๊ตฌ์กฐ (LยทR ์ ˆ๋ฐ˜์„ ๊ต์ฐจ ์น˜ํ™˜ยทํ˜ผํ•ฉ)
  • 40๋น„ํŠธ ํ‚ค์˜ ์ทจ์•ฝ์„ฑ: RSA Data Security ์ฑŒ๋ฆฐ์ง€ โ†’ Ian Goldberg(UC Berkeley)๊ฐ€ 3.5์‹œ๊ฐ„ ๋งŒ์— ํ•ด๋…
  • ํ˜„๋Œ€ ํ‘œ์ค€: AES-256 (์–‘์ž ์ปดํ“จํ„ฐ ๊ณต๊ฒฉ์—๋„ ํ‚ค ํฌ๊ธฐ ๋‘ ๋ฐฐ ์—ฌ์œ )

์–‘์ž ์ปดํ“จํŒ…๊ณผ ๋ธ”๋ก ์•”ํ˜ธ:

  • ๊ทธ๋กœ๋ฒ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜: ์–‘์ž ์ปดํ“จํ„ฐ๋กœ ๋ธŒ๋ฃจํŠธํฌ์Šค ๊ณต๊ฒฉ ์‹œ ํšจ๊ณผ์  ํ‚ค ํฌ๊ธฐ๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์ž„
  • ๋Œ€์‘: ํ‚ค ํฌ๊ธฐ๋ฅผ ๋‘ ๋ฐฐ(์˜ˆ: 256๋น„ํŠธ)๋กœ ๋Š˜๋ฆฌ๋ฉด ์ถฉ๋ถ„

๋น„๋Œ€์นญ ์•”ํ˜ธ โ€” RSA

ํ•ต์‹ฌ ์ˆ˜ํ•™:

P, Q = ๋‘ ์†Œ์ˆ˜     N = P ร— Q (๊ณต๊ฐœ)
ฯ†(N) = (P-1)(Q-1)
E: ฯ†(N)๊ณผ ์„œ๋กœ์†Œ์ธ ๊ณต๊ฐœ ์ง€์ˆ˜ (๊ณต๊ฐœ)
D = E^(-1) mod ฯ†(N)  โ†’ ๊ฐœ์ธํ‚ค (๋น„๋ฐ€)

์•”ํ˜ธํ™”: C = M^E mod N
๋ณตํ˜ธํ™”: M = C^D mod N

๋ณด์•ˆ ๊ทผ๊ฑฐ: N์„ ์†Œ์ธ์ˆ˜๋ถ„ํ•ดํ•˜๋ฉด P, Q โ†’ ฯ†(N) โ†’ D๋ฅผ ๊ณ„์‚ฐ ๊ฐ€๋Šฅ โ€” ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€ํ˜• N์˜ ์†Œ์ธ์ˆ˜๋ถ„ํ•ด๋Š” ํ˜„์žฌ ๋ถˆ๊ฐ€๋Šฅ.

  • ์ตœ์„ ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜: ์ˆ˜์ฒด ์‚ฌ์ „(Number Field Sieve, NFS) โ€” ์ค€์ง€์ˆ˜ ์‹œ๊ฐ„
  • 2048๋น„ํŠธ RSA๋Š” ํ˜„์žฌ ์•ˆ์ „

ํ•ต์‹ฌ ์ธ์‚ฌ์ดํŠธ

์†Œ์œ ์ž ๊ด€์ ์—์„œ ์ค‘์š”ํ•œ ๊ฒƒ

  1. ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋Š” ๋ชจ๋“  ์ต์Šคํ”Œ๋กœ์ž‡์˜ ๊ธฐ์ดˆ โ€” EIP ์ œ์–ด = ์ฝ”๋“œ ์‹คํ–‰ ์ œ์–ด. ๋ฆฌํ„ด ์ฃผ์†Œ ํ•˜๋‚˜๊ฐ€ ์‹œ์Šคํ…œ ์ „์ฒด๋ฅผ ๋‚ด์ค€๋‹ค.
  1. ๋ฐฉ์–ด ๊ธฐ๋ฒ•์€ ๋ ˆ์ด์–ด๋กœ ๊ฒน์ณ์•ผ ์˜๋ฏธ ์žˆ๋‹ค โ€” ASLR๋งŒ, ์นด๋‚˜๋ฆฌ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑ. ๊ฐ ๊ธฐ๋ฒ•์—๋Š” ์šฐํšŒ๊ฐ€ ์žˆ์Œ. Defense in Depth๊ฐ€ ์œ ์ผํ•œ ๋‹ต.
  1. ํฌ๋งท ์ŠคํŠธ๋ง ์ทจ์•ฝ์  = ๋‹จ ํ•œ ์ค„์˜ ์‹ค์ˆ˜ โ€” printf(buf) vs printf("%s", buf). ์ž„์˜ ์ฃผ์†Œ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ ๋ชจ๋‘ ํ—ˆ์šฉ. ์—ฌ์ „ํžˆ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์—์„œ ๋ฐœ๊ฒฌ๋จ.
  1. ์…ธ์ฝ”๋“œ ์ œ์•ฝ ์กฐ๊ฑด โ€” ์‹ค์ œ ๊ณต๊ฒฉ์—์„œ null ๋ฐ”์ดํŠธยทํ”„๋ฆฐํ„ฐ๋ธ” ๋ฌธ์žยทํŠน์ • ๋ฐ”์ดํŠธ ๊ธˆ์ง€ ๋“ฑ ๋‹ค์–‘ํ•œ ์ œ์•ฝ์ด ์กด์žฌ. ํด๋ฆฌ๋ชจํ”ฝ ๊ธฐ๋ฒ•์ด ์ด๋ฅผ ๊ทน๋ณตํ•˜๋Š” ์ฐฝ์˜์  ํ•ด๋ฒ•.
  1. ํ”„๋กœํ† ์ฝœ ์ดํ•ด๊ฐ€ ๊ณต๊ฒฉ์˜ ์ „์ œ โ€” TCP ์‹œํ€€์Šค ๋ฒˆํ˜ธ, IP ๋‹จํŽธํ™”, ICMP ๊ตฌ์กฐ๋ฅผ ๋ชจ๋ฅด๋ฉด SYN ํ”Œ๋Ÿฌ๋“œ๋„ RST ํ•˜์ด์žฌํ‚น๋„ ๋ถˆ๊ฐ€๋Šฅ. ์ด ์ฑ…์ด "๊ธฐ๋ฒ•"๋ณด๋‹ค "์›๋ฆฌ"๋ฅผ ๋จผ์ € ๊ฐ€๋ฅด์น˜๋Š” ์ด์œ .
  1. RSA ๋ณด์•ˆ = ์ˆ˜ํ•™ ๋ฌธ์ œ์˜ ์–ด๋ ค์›€ โ€” ์•”ํ˜ธ์˜ ๊ฒฌ๊ณ ํ•จ์€ ๋‹จ์ˆœํžˆ "ํ‚ค๊ฐ€ ํฌ๋‹ค"๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์ˆ˜ํ•™์  ๋ฌธ์ œ์˜ ๊ณ„์‚ฐ ๋ณต์žก๋„์— ๊ทผ๊ฑฐ. ์–‘์ž ์ปดํ“จํŒ…์ด ์ด๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Œ.


์ €์ž

  • Jon Erickson: ๋ณด์•ˆ ์—ฐ๊ตฌ์ž. No Starch Press์™€ ํ•จ๊ป˜ ์ด ์ฑ…์„ 2003๋…„(์ดˆํŒ), 2008๋…„(2ํŒ)์— ์ถœ๊ฐ„. "๊ธฐ๋ฒ•์„ ๋‚˜์—ดํ•˜์ง€ ์•Š๊ณ  ์ดํ•ด๋ฅผ ๊ฐ€๋ฅด์น˜๋Š”" ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ํ•ดํ‚น ์ž…๋ฌธ์„œ ์ค‘ ๊ฐ€์žฅ ๊ธฐ์ดˆ๊ฐ€ ํƒ„ํƒ„ํ•œ ์ฑ…์œผ๋กœ ํ‰๊ฐ€๋ฐ›์Œ.