๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿคท๐Ÿผ‍โ™€๏ธ Etc.../- ๊ธฐํƒ€

[๊ฐœ๋ฐœ์ž ์ฑ…์ฝ๊ธฐ] ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด-์กฐ์˜ํ˜ธ (7์žฅ ํ•จ๊ป˜ ๋ชจ์œผ๊ธฐ)

by Wonit 2021. 4. 10.

ํ•ด๋‹น ๊ธ€์€ ์กฐ์˜ํ˜ธ๋‹˜์˜ ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด ์—ญํ• , ์ฑ…์ž„, ํ˜‘๋ ฅ, ๊ด€์ ์—์„œ ๋ณธ ๊ฐ์ฒด์ง€ํ–ฅ ๋ผ๋Š” ์ฑ…์„ ์ฝ๊ณ  ํ•™์Šตํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌ ๋ฐ ํšŒ๊ณ ํ•˜๋Š” ๊ธ€ ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์‚ฌํ•ญ์€ YES 24 ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด ์—์„œ ํ™•์ธํ•ด์ฃผ์„ธ์š”.

๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด - ์—ญํ• , ์ฑ…์ž„, ํ˜‘๋ ฅ ๊ด€์ ์—์„œ ๋ณธ ๊ฐ์ฒด์ง€ํ–ฅ (์กฐ์˜ํ˜ธ)

  • ์œ„ํ‚ค๋ถ์Šค
  • ์ง€์€์ด: ์กฐ์˜ํ˜ธ
  • ํŽด๋‚ธ์ด: ๋ฐ•์ฐฌ๊ทœ, ์—ฎ์€์ด: ์ด๋Œ€์—ฝ, ๋””์ž์ธ: ๋ถ๋ˆ„๋ฆฌ
  • 1์‡„ ๋ฐœํ–‰: 2015.06.17


์ด๋ฒˆ ์žฅ์—์„œ ์ด์•ผ๊ธฐํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ

์ด๋ฒˆ ์žฅ์€ ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๋‚ด์šฉ์˜ ์ด๋ก ๋“ค์„ ์‹ค์ œ๋กœ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋‹ค. ์š”์•ฝ๋ณด๋‹ค๋Š” ์•„๋ž˜์˜ ์‹ค์Šต ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ •๋ฆฌ๋ฅผ ๋Œ€์ฒดํ•˜๊ฒ ๋‹ค.

  • ํ•จ๊ป˜ ๋ชจ์œผ๊ธฐ
    • ๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์•ˆ์— ์กด์žฌํ•˜๋Š” 3๊ฐ€์ง€ ๊ด€์ ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…
      1. ๊ฐœ๋… ๊ด€์ 
      2. ๋ช…์„ธ ๊ด€์„ฌ
      3. ๊ตฌํ˜„ ๊ด€์ 
  • ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋‹ค์ด์–ด๊ทธ๋žจ
    • UML ์€ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ ๋„๊ตฌ๊ฐ€ ์•„๋‹ˆ๋‹ค.
    • ๋„๋ฉ”์ธ ๋ชจ๋ธ๋ง๊ณผ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ํ™œ์šฉํ•˜๋ผ
      • ๋„๋ฉ”์ธ ๋ชจ๋ธ๋ง์—์„œ ํฌํ•จ๊ด€๊ณ„์™€ ์—ฐ๊ด€๊ด€๊ณ„๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค
        • ์ดˆ์ ์€ ์–ด๋–ค ํƒ€์ž…์ด ์–ด๋–ค ๋„๋ฉ”์ธ์„ ๊ตฌ์„ฑํ•˜๋Š๋ƒ์™€ ํƒ€์ž…๋“ค ์‚ฌ์ด์˜ ๊ด€๊ณ„๊ฐ€ ์–ด๋–ค ๊ด€๊ณ„์ธ์ง€ ๊ทœ๋ช…ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
        • ๋„๋ฉ”์ผ ๋ชจ๋ธ๋ง์—์„œ๋Š” ๋‹จ์ง€ ๊ด€๊ณ„๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€๋งŒ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค.
        • ๋˜ํ•œ ํ˜„์‹ค ์„ธ๊ณ„์˜ ๋Šฅ๋™์„ฑ๊ณผ ์ˆ˜๋™์„ฑ์€ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค.
          • ๊ฐ์ฒด์ง€ํ–ฅ์—์„œ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ์Šค์Šค๋กœ ์‚ฌ๊ณ ํ•˜๊ณ  ์„ ํƒํ•˜๋Š” ์ž์œจ์ ์ธ ์กด์žฌ์ด๋‹ค.
          • ์ด๊ฒŒ ํž˜๋“ค๋ฉด ์˜์ธํ™”๋ฅผ ํ•ด๋ผ
    • ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋‹ค์ด์–ด๊ทธ๋žจ
      • ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋‹ค์ด์–ด๊ทธ๋žจ์€ ๋ฉ”์‹œ์ง€์˜ ๋ฐฉํ–ฅ๊ณผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋” ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
      • ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ ๋‚˜์˜จ ๋ฉ”์‹œ์ง€๋ฅผ ํ† ๋Œ€๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
  • ๋„๋ฉ”์ธ ๊ฐœ๋…์„ ์ฐธ์กฐํ•˜๋ผ
    • ํ˜„์‹ค ์„ธ๊ณ„์˜ ์†Œํ”„ํŠธ์›จ์–ด๋Š” ํ•ญ์ƒ ๋ณ€ํ•œ๋‹ค.
    • ๋„๋ฉ”์ธ ๋ชจ๋ธ์€, ์ฆ‰ ํ…Œ์ด๋ธ” ๋ชจ๋ธ์€ ๋ณ€ํ™”์— ์•„์ฃผ ๋ฏผ์ฒฉํ•˜๋‹ค.
    • ๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋Š” ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ๋”ฐ๋ผ์„œ ๊ฐ์ฒด๋ฅผ ์„ค๊ณ„ํ•ด์•ผ ๋ณ€ํ™”์— ๋ฏผ์ฒฉํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
  • ์ด๋ฒˆ ์žฅ์€ ์‹ค์Šต์ด ๋Œ€๋ถ€๋ถ„์ด๋ฏ€๋กœ ์•„๋ž˜์˜ ์‹ค์Šต์œผ๋กœ ์š”์•ฝ์„ ๋Œ€์ฒด
    • ๋„๋ฉ”์ธ ๋ชจ๋ธ๋ง

๋‚˜์˜ ํ•ด์„๊ณผ ํšŒ๊ณ 

์ด๋ฒˆ ์žฅ์€ ์•„๋งˆ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์žฅ์ด ๋˜์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•œ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๋ชจ๋“  ๊ฐœ๋…์„ ์ด์šฉํ•ด์„œ ์‹ค์ œ๋กœ ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์„ค๊ณ„๋ฅผ ํ•˜๋Š” ๋ถ€๋ถ„์ด๊ธฐ ๋–„๋ฌธ์ด๋‹ค.

์ฑ…์—์„œ๋Š” 1์žฅ์—์„œ ๋ณด์•˜๋˜ ์ปคํ”ผ๊ฐ€๊ฒŒ๋ฅผ ๋ชจ๋ธ๋งํ•˜์ง€๋งŒ ๋‚˜๋Š” ์กฐ๊ธˆ ๋ฐ”๊ฟ”์„œ Wargame ์‚ฌ์ดํŠธ๋ฅผ ์„ค๊ณ„ํ•˜๋ ค ํ•œ๋‹ค.

wargame ์ด๋ž€? ๋ชจ์˜ ํ•ดํ‚น์„ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ์ฒดํ—˜ํ˜• ํ•ดํ‚น ๊ฒŒ์ž„์œผ๋กœ ์—ฌ๋Ÿฌ ๋ถ„์•ผ(์›น ํ•ดํ‚น, ๋ชจ๋ฐ”์ผ ํ•ดํ‚น, ์‹œ์Šคํ…œ ํ•ดํ‚น, ๋ฆฌ๋ฒ„์‹ฑ, ํฌ๋ Œ์‹) ๋“ฑ์ด ์žˆ๋‹ค.
๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ์‚ฌ์šฉ์ž๋Š” ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ๋‹ค์šด๋กœ๋“œ (์›น์ด๋ผ๋ฉด url ์ ‘์†)ํ•œ ๋’ค ๋ฌธ์ œ ์†์— ์žˆ๋Š” flag ๊ฐ’์„ ์ฐพ๊ณ  ์ ์ˆ˜๋ฅผ ์–ป๋Š” ๋ฐฉ์‹์ด๋‹ค.
CTF ๋Œ€ํšŒ์˜ ๊ธฐ๋ณธ ๋ฌธ์ œ ํ’€์ด ๊ฐœ๋…์œผ๋กœ ์œ ๋ช…ํ•œ ์‚ฌ์ดํŠธ๋กœ๋Š” dreamhack.io, webhacking.kr ๋“ฑ์ด ์žˆ๊ณ  ์œ ๋ช…ํ•œ ๋Œ€ํšŒ๋กœ๋Š” Defcon, Codegate, LineCTF ๋“ฑ์ด ์žˆ๋‹ค.

๋„๋ฉ”์ธ

๋ฐฑ์ค€์„ ๋ชจ๋ธ๋งํ•œ ๋„๋ฉ”์ธ ๋ชจ๋ธ์˜ ์ฐธ์—ฌ ๋„๋ฉ”์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • User.class
    • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์‚ฌ์šฉ์ž
  • Problem.class
    • ์‚ฌ์šฉ์ž๊ฐ€ ํ’€์–ด์•ผํ•  ๋ฌธ์ œ
  • ProblemList.class
    • ์‚ฌ์šฉ์ž๊ฐ€ ํ’€์–ด์•ผํ•  ๋ฌธ์ œ๋“ค
  • Scoring.class
    • ์ •๋‹ต์„ ์ฑ„์ ํ•  ์ฑ„์ ์ž

์ด๋ฅผ ๋„๋ฉ”์ธ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๋งŒ์•ฝ ์‹ค์ œ๋กœ ๊ทธ๋ ค๋ณด๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๋“ค์€ draw.io ์—์„œ ์‹ค์ œ๋กœ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ทธ๋ฆด์ˆ˜ ์žˆ๋‹ค.

์ฑ…์ž„ ์ฐพ์•„๋ณด๊ธฐ

์ด์ œ ๋„๋ฉ”์ธ ์ฆ‰, ์—ญํ• ๊ณผ ์ฑ…์ž„ ๊ทธ๋ฆฌ๊ณ  ํ˜‘๋ ฅ์„ ์ˆ˜ํ–‰ํ•  ๋Œ€์ƒ๋“ค์ด ์ •ํ•ด์กŒ์œผ๋‹ˆ ์ง€๊ธˆ๊นŒ์ง€ ๊ณ„์† ๋ฐฐ์šด ํ˜‘๋ ฅ์˜ ๊ด€์ ์—์„œ ๊ฐ๊ฐ์˜ ์ฑ…์ž„์„ ์ •์˜ํ•ด๋ณด์ž.

  • User.class
    • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์‚ฌ์šฉ์ž
      • ๋ฌธ์ œ ๋ชฉ๋ก์—์„œ ๋ฌธ์ œ๋ฅผ ๋ฐ›์•„ ๋ฌธ์ œ๋ฅผ ํ’€์ดํ•œ๋‹ค.
        • ๋ฌธ์ œ๋ฅผ ์š”์ฒญํ•˜๋Š” ์ฑ…์ž„
      • ํ’€์ด๋ฅผ ์ œ์ถœํ•œ๋‹ค.
        • ๋ฌธ์ œ ํ’€์ด๋ฅผ ์š”์ฒญํ•˜๋Š” ์ฑ…์ž„
  • ProblemList.class
    • ์‚ฌ์šฉ์ž๊ฐ€ ํ’€์–ด์•ผํ•  ๋ฌธ์ œ๋“ค
      • ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌธ์ œ ํ’€์ด ์š”์ฒญ์„ ํ•œ๋‹ค๋ฉด ํ’€์ด๋ฅผ ์›ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.
        • ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•˜๋Š” ํŠน์ • ๋ฌธ์ œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฑ…์ž„
  • Problem.class
    • ์‚ฌ์šฉ์ž๊ฐ€ ํ’€์–ด์•ผํ•  ๋ฌธ์ œ
      • ๋ฌธ์ œ์˜ ์ •๋‹ต๊ณผ ์ ์ˆ˜๋ฅผ ์ฑ„์ ์ž์—๊ฒŒ ์ œ๊ณตํ•œ๋‹ค.
        • ๋ฌธ์ œ ์ •๋‹ต๊ณผ ์ ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ฑ…์ž„
  • Scoring.class
    • ์ •๋‹ต์„ ์ฑ„์ ํ•  ์ฑ„์ ์ž
      • ๋ฌธ์ œ์—๊ฒŒ ์ •๋‹ต์„ ์š”์ฒญํ•˜์—ฌ ์ •๋‹ต ๊ฐ’์„ ๋น„๊ตํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
        • ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ๋ฐ›๊ณ  flag ๊ฐ’์„ ๊ฒ€์ฆํ•˜๊ณ  ์ ์ˆ˜๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋Š” ์ฑ…์ž„

๊ทธ๋Ÿผ ์ฑ…์ž„์— ๋Œ€ํ•œ ๋ฉ”์‹œ์ง€์˜ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

์ž˜ ์ƒ๊ฐํ•ด๋ณด์ž. ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ ํ–‰๋™์„ ๋จผ์ € ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์–ด๋–ค ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๊ณ  ์–ด๋–ค ๊ฐ’๋“ค์ด ํ•„์š”ํ•œ์ง€๋Š” ์•„์ง ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๋‹ค. ์ด๋ ‡๊ฒŒ ํ–‰๋™์„ ๋จผ์ € ์ƒ๊ฐํ•˜๋Š”๊ฒŒ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ ์‹œ์ž‘์ด๋‹ค.

ํ–‰๋™ ์ฐพ์•„๋ณด๊ธฐ

์ด์ œ ์—ญํ• ๊ณผ ์ฑ…์ž„์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜์œผ๋‹ˆ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ชฉ์ ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ–‰๋™์„ ์ฐพ์•„์„œ ๊ทธ๋ ค๋ณด์ž.

์ด์™€ ๊ฐ™์ด ๋  ๊ฒƒ์ด๋‹ค.

๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ํ˜‘๋ ฅํ•  ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ํ•˜๊ธฐ

ํ–‰๋™์„ ์ •์˜ํ–ˆ์œผ๋‹ˆ ๋ฐ–์—์„œ ๋ณด์—ฌ์งˆ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž.

  • User.class
    • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์‚ฌ์šฉ์ž
      • ๋ฌธ์ œ ๋ชฉ๋ก์—์„œ ๋ฌธ์ œ๋ฅผ ๋ฐ›์•„ ๋ฌธ์ œ๋ฅผ ํ’€์ดํ•œ๋‹ค.
        • void solve(int problemId, ProblemList problemList).method
      • ํ’€์ด๋ฅผ ์ œ์ถœํ•œ๋‹ค.
        • void scoring(String flag).method
  • ProblemList.class
    • ์‚ฌ์šฉ์ž๊ฐ€ ํ’€์–ด์•ผํ•  ๋ฌธ์ œ๋“ค
      • ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌธ์ œ ํ’€์ด ์š”์ฒญ์„ ํ•œ๋‹ค๋ฉด ํ’€์ด๋ฅผ ์›ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.
        • Problem choose(int problemId).method
  • Problem.class
    • ์‚ฌ์šฉ์ž๊ฐ€ ํ’€์–ด์•ผํ•  ๋ฌธ์ œ
      • ๋ฌธ์ œ์˜ ์ •๋‹ต๊ณผ ์ ์ˆ˜๋ฅผ ์ฑ„์ ์ž์—๊ฒŒ ์ œ๊ณตํ•œ๋‹ค.
        • String getPoint().method
          • String getFlag().method
  • Scoring.class
    • ์ •๋‹ต์„ ์ฑ„์ ํ•  ์ฑ„์ ์ž
      • ๋ฌธ์ œ์—๊ฒŒ ์ •๋‹ต์„ ์š”์ฒญํ•˜์—ฌ ์ •๋‹ต ๊ฐ’์„ ๋น„๊ตํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
        • void validateFlag(int userId, Problem problem, userFlag.method

์—ฌ๊ธฐ์„œ ๋ง ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ž€ java์˜ interface ๊ฐ€ ์•„๋‹Œ ์ ์„ ์œ ์˜ํ•˜์ž.


์—ฌ๊ธฐ์„œ ๋ง ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์—์„œ ์™ธ๋ถ€ ๊ฐ์ฒด์—๊ฒŒ ๋ณด์—ฌ์ง€๊ธฐ ์œ„ํ•œ ์ ‘์ , java ์—์„œ public ์ ‘๊ทผ์ž๋กœ ์ง€์ •๋œ ๋ฉ”์„œ๋“œ๋ฅผ ๋œปํ•œ๋‹ค.


public class User {
    // ๋ฌธ์ œ ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๋ผ
    public void solve(){ }

    // ์ •๋‹ต์„ ์š”์ฒญํ•˜๋ผ, ์ •๋‹ต์„ flag ๋ผ๊ณ  ํ•จ
    public void scoring() { }
}

public class Scoring {
    // ๋ฌธ์ œ์—๊ฒŒ ์ •๋‹ต ๊ฐ’(ํ”Œ๋ž˜๊ทธ ๊ฐ’)๋ฅผ ์š”์ฒญ ํ›„ ๊ฒ€์ฆ
    public boolean validateFlag() { return false; }
}

public class ProblemList {
    // ๋ฌธ์ œ๋ฅผ ์„ ํƒํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋ผ
    Problem choose(int problemId) {
        return null;
    }
}

public class Problem {}

์‚ฌ์‹ค ์šฐ๋ฆฌ๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ ๊ถ๊ทน์  ๋ชฉํ‘œ๋Š” ์„œ๋น„์Šค ์ œ๊ณต์ด๋‹ค.

 

์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•„์—ฐ์ ์œผ๋กœ DB๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ์•„๋ž˜์˜ DBConnection ํด๋ž˜์Šค๊ฐ€ DB์™€ ๊ด€๋ จ๋œ ์ž‘์—…๋“ค์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

public class DBConnection {

    public void findUserById(int id) {
        System.out.println("์„ฑ๊ณต์ ์œผ๋กœ DB ์—์„œ ์‚ฌ์šฉ์ž๋ฅผ ๊ฒ€์ƒ‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.");
    }
    public void save(){
        System.out.println("๋ฐ์ดํ„ฐ๊ฐ€ DB์— ์„ฑ๊ณต์ ์œผ๋กœ ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
    }
}

์ด์ œ ๊ฐ์ฒด๊ฐ€ ์ž์œจ์„ฑ์„ ๊ฐ–๊ณ  ์—ญํ• ์„ ์ œ๋Œ€๋กœ ์™„์ˆ˜ํ•˜๊ฒŒ ๋„์™€์ค„ ๋‚ด๋ถ€ ํ˜‘๋ ฅ์ž๋“ค์„ ๊ตฌํ˜„ํ•ด๋ณด์ž!

๊ตฌํ˜„ํ•˜๊ธฐ

์ง€๊ธˆ ๊นŒ์ง€ ์ƒํƒœ์— ํ•ด๋‹นํ•˜๋Š” field ๋ฅผ ํ•˜๋‚˜๋„ ๋„ฃ์ง€ ์•Š์•˜๋‹ค.

 

์ด์ œ ์–ด๋–ค field๊ฐ€ ํ•„์š”ํ• ์ง€ ํ–‰๋™์„ ํ† ๋Œ€๋กœ ์ ์ ˆํžˆ ๋งŒ๋“ค์–ด ๋„ฃ์–ด์ฃผ์ž.

User

public class User {

    private int id;
    private String name;
    private Problem solvingProblem;

    // ๋ฌธ์ œ ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๋ผ
    public void solve(int problemId, ProblemList problemList){
        solvingProblem = problemList.choose(problemId);
    }

    // ์ •๋‹ต์„ ์š”์ฒญํ•˜๋ผ, ์ •๋‹ต์„ flag ๋ผ๊ณ  ํ•จ
    public void scoring(String flag) {

        DBConnection dbConnection = new DBConnection();

        Scoring scoring = new Scoring();

        scoring.validateFlag(this.id, solvingProblem, flag);
    }
}

ํ•ต์‹ฌ์€ solve ๋ฉ”์„œ๋“œ์™€ scoring ๋ฉ”์„œ๋“œ์ด๋‹ค.

 

์ด ๋‘ ๋ฉ”์„œ๋“œ์—์„œ ๊ฐ๊ฐ Scoring ๊ฐ์ฒด์™€ ProblemList ๊ฐ์ฒด ์‚ฌ์ด์— ์–ด๋–ป๊ฒŒ ํ˜‘๋ ฅํ•˜๋Š”์ง€ ๊ตฌํ˜„ํ•˜์ž.

Problem

public class Problem {
    private int id;
    private String title;
    private String content;
    private String flag;
    private int point;

    public Problem(int id, String title, String content, String flag, int point) {
        // ์ƒ์„ฑ์ž ์„ธ๋ถ€ ๋‚ด์šฉ ์ƒ๋žต AllargConstructor
    }

    public int getId() {
        return id;
    }

    public String getFlag() {
        return flag;
    }

    public int getPoint() {
        return point;
    }
}

๋ฌธ์ œ์™€ ํ˜‘๋ ฅํ•  ๊ฐ์ฒด์—์„œ๋Š” Flag ๊ฐ’๊ณผ Point ๊ฐ’๋งŒ ํ•„์š”๋กœ ํ•˜๋‹ˆ getter ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์ž.

ProblemList

public class ProblemList {

    private List<Problem> problemList;

    public ProblemList(List<Problem> problemList) {
        this.problemList = problemList;
    }

    // ๋ฌธ์ œ๋ฅผ ์„ ํƒํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋ผ
    Problem choose(int problemId) {
        for(Problem each : problemList) {
            if(each.getId() == problemId) {
                return each;
            }
        }
        return null;
    }
}

Scoring

public class Scoring {

    // ๋ฌธ์ œ์—๊ฒŒ ์ •๋‹ต ๊ฐ’(ํ”Œ๋ž˜๊ทธ ๊ฐ’)๋ฅผ ์š”์ฒญ ํ›„ ๊ฒ€์ฆ
    public void validateFlag(int userId, Problem problem, String userFlag) {
        DBConnection dbConnection = new DBConnection();

        dbConnection.findUserById(userId);

        if(problem.getFlag().equals(userFlag)){
            dbConnection.save();
            System.out.println("์ •๋‹ต์ž…๋‹ˆ๋‹ค! ์„ฑ๊ณต์ ์œผ๋กœ " + problem.getPoint() + " Point ๋งŒํผ์˜ ์ ์ˆ˜๊ฐ€ ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
        } else {
            System.out.println("์˜ค๋‹ต์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”");
        }
    }
}

์šฐ๋ฆฌ๊ฐ€ ์„ค๊ณ„ํ•œ ๊ฐ์ฒด์ง€ํ–ฅ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž.

์œ„์—์„œ ์„ค๊ณ„ํ•œ ์šฐ๋ฆฌ์˜ ์„œ๋น„์Šค๋ฅผ ์ด์ œ ์ด์šฉํ•ด๋ณด์ž.

Main

public class Main {
    public static void main(String[] args) {
        List<Problem> problems = new ArrayList<>();
        problems.add(new Problem(1,
                "์ทจ์•ฝํ•œ ๊ฒŒ์‹œํŒ",
                "ํ•ด๋‹น ๊ฒŒ์‹œํŒ์€ ์–ด๋– ํ•œ ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฒŒ์‹œํŒ์„ ์ด์šฉํ•˜์—ฌ ๋‚ด๋ถ€ ์„œ๋ฒ„๋กœ ๋“ค์–ด๊ฐ€์„œ SSRF ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ํ”Œ๋ž˜๊ทธ ๊ฐ’์„ ์ฐพ์œผ์„ธ์š”.",
                "CTF{142A-ECH}",
                100));

        problems.add(new Problem(2,
                "์ด์ƒํ•œ ์‚ฌ์ง„",
                "์–ด์ œ ์›์ต์ด๋Š” ๋ฌด๋ฃŒ ์‚ฌ์ง„ ์‚ฌ์ดํŠธ์—์„œ ์‚ฌ์ง„ ํ•˜๋‚˜๋ฅผ ๋‹ค์šด๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค์Œ๋‚  ์ผ์–ด๋‚˜๋ณด๋‹ˆ ์ปดํ“จํ„ฐ์— ๋ชจ๋“  ํŒŒ์ผ์ด ์ž ๊ฒผ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํŒŒ์ผ์„ ๋ถ„์„ํ•˜๊ณ  flag ๊ฐ’์„ ์ฐพ์œผ์„ธ์š”",
                "CTF{778Q-ADE}",
                150));

        problems.add(new Problem(3,
                "๊ทผ๋ฌด ์‹œ๊ฐ„ ์ฐพ๊ธฐ",
                "๋ฒ”์ฃ„์ž์˜ ํœด๋Œ€ํฐ์„ ์••์ˆ˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฒ”์ฃ„์ž๊ฐ€ ๊ทผ๋ฌดํ•œ ์‹œ๊ฐ„์— ๋ฒ”์ฃ„๊ฐ€ ์ผ์–ด๋‚ฌ๋Š”๋ฐ, ๋ฒ”์ฃ„์ž๋Š” ๋ฐœ๋บŒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ”์ฃ„์ž์˜ ํœด๋Œ€ํฐ์„ ํฌ๋ Œ์‹ํ•˜์—ฌ Flag ๊ฐ’์„ ์ฐพ์œผ์„ธ์š”",
                "CTF{2341-BCD}",
                50));

        ProblemList problemList = new ProblemList(problems);

        User user = new User();

        // ์ •๋‹ต์ผ ๊ฒฝ์šฐ
        System.out.println("-------------๊ตฌ๋ถ„์„ -------------");
        user.solve(1, problemList);
        user.scoring("CTF{1A-EH}"); // ์˜ค๋‹ต ํ”Œ๋ž˜๊ทธ ์ž…๋ ฅ

        // ์˜ค๋‹ต์ผ ๊ฒฝ์šฐ
        System.out.println("-------------๊ตฌ๋ถ„์„ -------------");
        user.solve(3, problemList);
        user.scoring("CTF{2341-BCD}"); // ์ •๋‹ต ํ”Œ๋ž˜๊ทธ ์ž…๋ ฅ
    }
}

 

๋Œ“๊ธ€