Have some discounted Halloween stuff on Christmas Day, just like Baby Christ intended. https://store.steampowered.com/developer/STEG_GAME_DEV #christmas #halloween #renpy #visualnovel #indiedev
#GodotEngine #visualNovel #RenPy
Hi, after long silence I have new Rakugo devlog for you:
https://rakugoteam.github.io/devlog-07-25/
Rakugo Project Devlog #7/25

Merry Christmas and Happy New Year, some news and small updates

Rakugo Project
#GodotEngine #visualNovel #RenPy
Hi, after long silence I have new Rakugo devlog for you:
https://rakugoteam.github.io/devlog-07-25/
Rakugo Project Devlog #7/25

Merry Christmas and Happy New Year, some news and small updates

Rakugo Project

Weekend Warrior Mode ๐Ÿ› ๏ธ๐ŸŽฎ
๐Ÿ“… December 20, 2025

โ€ข #Beyond365DaysOfCode Day 356
โ€ข #100DaysOfCode Day 356
โ€ข #freeCodeCamp

๐Ÿ“– Daily Reading
โœ… freeCodeCamp News โ€“ 1 article
โœ… Daily.dev โ€“ 1 article

๐Ÿ’ป Current Focus
โ€ข Winter VN Jam: Added a window selection image and repositioned it for a cleaner UI experience

Weekend polish still counts. Consistency wins.

#Python #WeekendWarrior #GameDev #PolishPass #RenPy #IndieDev

Thursday Dev Update ๐ŸŽฎ๐Ÿ“š
๐Ÿ“… December 18, 2025

โ€ข #Beyond365DaysOfCode Day 354
โ€ข #100DaysOfCode Day 354
โ€ข #freeCodeCamp

๐Ÿ“– Daily Reading
โœ… freeCodeCamp News โ€“ 1 article
โœ… Daily.dev โ€“ 1 article

๐Ÿ’ป Current Focus
โ€ข Winter VN Jam: Renamed background assets and integrated them into the script for smoother scene transitions

Small refinements add up to a better player experience.

#Python #RenPy #GameDev #NarrativeDesign #VisualNovel #InteractiveFiction #DevJourney

Tuesday Progress Update ๐ŸŽฎ๐Ÿ“–
๐Ÿ“… December 16, 2025

โ€ข #Beyond365DaysOfCode Day 352
โ€ข #100DaysOfCode Day 352
โ€ข #freeCodeCamp

๐Ÿ“– Daily Reading
โœ… freeCodeCamp News โ€“ 1 article
โœ… Daily.dev โ€“ 1 article

๐Ÿ’ป Current Focus
โ€ข Winter VN Jam: Tested dialogue triggers for side characters to support story flow and player choice

Building stories one line of code at a time.

#RenPy #Python #GameDevJourney #StoryDesign #GameWriting #VNDev #DevJourney

 For any #VisualNovel enjoyers, my friend MullyWhizz just dropped a new game called #LamentOfAPlatinumRose. Has aspects of #cyberpunk and #surrealism. You play as a robot driven by a quest to protect her Queen, the rest you should see for yourself.

https://loapr.itch.io/loapr

#indieGame #renpy #itchio #freeware #videoGames #MullyWhizz

๐ŸŽฎ 'Time to Explain!'
a game by falafelovore
France

๐Ÿ’ฅ A time loop puzzle game about communication.

๐Ÿง Will you manage to manage time in time?

๐ŸŒ https://jag.itch.io/time

Play in your browser at itchio or download to Windows or Linux computers.

#communication #game #indiegame #Renpy #itchio #gamejolt #education #puzzle #windows #linux @gamingagainstv @stopTDV @itchio @stopTDV

Time to Explain! by JAG

Will you manage to manage time in time?

itch.io

๋ฏธ์†Œ๋…€ ๋ณด๋ ค๊ณ  ๋ฏธ์—ฐ์‹œ๋ฅผ ์ผฐ๋”๋‹ˆ ๊ฒŒ์ž„ ์ฝ˜์†”์ด ํ•ดํ‚น๋‹นํ–ˆ์–ด์š”

https://hackers.pub/@helloyunho/2025/yarpe-yet-another-renpy-playstation-exploit

๋ฏธ์†Œ๋…€ ๋ณด๋ ค๊ณ  ๋ฏธ์—ฐ์‹œ๋ฅผ ์ผฐ๋”๋‹ˆ ๊ฒŒ์ž„ ์ฝ˜์†”์ด ํ•ดํ‚น๋‹นํ–ˆ์–ด์š”

๋‹น์‹ ์€ ๊ฒŒ์ž„์— ๊ฐ‡ํžŒ ๋ฏธ์†Œ๋…€๋“ค์„ ๋ณด๊ธฐ ์œ„ํ•ด PlayStation์„ ์ผฐ์Šต๋‹ˆ๋‹ค. ๋งˆ์นจ ์นœ๊ตฌ๊ฐ€ "๋‚˜ ์ด์ชฝ ๋ฃจํŠธ ํด๋ฆฌ์–ดํ–ˆ๋Š”๋ฐ ๋„ˆ๋„ ๋ณผ๋ž˜?" ๋ผ๋ฉฐ ์„ธ์ด๋ธŒ ํŒŒ์ผ์„ ์ฃผ๋„ค์š”. ๋งˆ์นจ ๊ทธ ๋ฃจํŠธ๋กœ ๊ฐˆ ์‹œ๊ธฐ๋ฅผ ๋†“์นœ ๋‹น์‹ ์€ ์นœ๊ตฌ์˜ ์„ธ์ด๋ธŒ๋ฅผ ์ด์šฉํ•ด ํ™•์ธํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์„ธ์ด๋ธŒ๋ฅผ ๋“ฑ๋ก ํ›„, ๋ฏธ์—ฐ์‹œ๋ฅผ ์ผœ์„œ ๋กœ๋“œํ–ˆ๋Š”๋ฐ..? ๊ฐ‘์ž๊ธฐ ์ฝ˜์†”์ด ๋ฉˆ์ถ”๋ฉฐ ๊ฒฐ๊ตญ ์ฝ˜์†” ๋‚ด๋ถ€ ์ €์žฅ๊ณต๊ฐ„์„ ํฌ๋งทํ–ˆ์Šต๋‹ˆ๋‹ค! ... ๋‹น์—ฐํžˆ ์œ„ ๋‚ด์šฉ์€ ์‹ค์ œ ์Šคํ† ๋ฆฌ๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ, ์ถฉ๋ถ„ํžˆ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ ์„ค๋ช…ํ•  ๋‚ด์šฉ๋“ค๋กœ ๋ง์ด์ฃ . yarpe yarpe(Yet Another Ren'Py PlayStation Exploit)๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค! ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” Ren'Py ๊ธฐ๋ฐ˜์˜ PlayStation ๊ฒŒ์ž„๋“ค์—์„œ ์ ์šฉ๋˜๋Š” ์ทจ์•ฝ์ ์ด๋ฉฐ, ํ˜„ ์‹œ์ ์—์„œ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒŒ์ž„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: A YEAR OF SPRINGS PS4 (CUSA30428, CUSA30429, CUSA30430, CUSA30431) Arcade Spirits: The New Challengers PS4 (CUSA32096, CUSA32097) ๊ทธ๋Ÿฐ๋ฐ, ์ด ๋ชจ๋“  ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์‹œ์ž‘๋˜์—ˆ๊ณ , ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์ง„๊ฑธ๊นŒ์š”? Xbox One/Series ์‚ฌ์‹ค ์ €๋Š” PlayStation(์ดํ•˜ PS๋กœ ์ค„์—ฌ์„œ ๋งํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค)์— ๊ด€์‹ฌ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ Xbox์— ๋งŽ์€ ๊ด€์‹ฌ์ด ์žˆ์—ˆ์ฃ . ์ฒ˜์Œ Xbox One/Series์˜ ์ปค๋„ ์ทจ์•ฝ์ ์ด ์ƒ๊ฒผ์„ ๋•Œ Warhammer: Vermintide 2์˜ ๊ฒŒ์ž„ ์„ธ์ด๋ธŒ ์ทจ์•ฝ์ ์„ ์ด์šฉํ•œ ๊ฒŒ์ž„ ๋คํ”„๊ฐ€ ์ œ ๋ˆˆ์— ์žกํ˜”์Šต๋‹ˆ๋‹ค. ๊ทธ๋•Œ ๋ฌธ๋œฉ ๋“  ์ƒ๊ฐ์ด: "๋‹ค๋ฅธ ๊ฒŒ์ž„์€ ์ด๋Ÿฐ ์„ธ์ด๋ธŒ ์ทจ์•ฝ์ ์ด ์—†์„๊นŒ?" ์˜€๋Š”๋ฐ์š”, ์ €์™€ ๊ฐ™์ด ์ด๋Ÿฐ ์ž‘์—…์— ๊ด€์‹ฌ์„ ๋‘๋Š” ์นœ๊ตฌ๊ฐ€ ๋จผ์ € ์ถ”์ฒœํ•ด์ค€ ๊ฒƒ์€ RPG Maker(์ฏ”๊พธ๋ฅด ๋ผ๊ณ ๋„ ๋งŽ์ด ๋ถˆ๋ฆฌ์ฃ )๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฒŒ์ž„๋“ค์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์•„์‰ฝ๊ฒŒ๋„, ์ฝ˜์†” ๋ฒ„์ „์—์„œ ์‚ฌ์šฉํ•˜๋Š” RPG Maker ๊ฒŒ์ž„๋“ค์€ ๋‹ค๋ฅธ ์„ธ์ด๋ธŒ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ์—ˆ๊ณ , ACE(Arbitrary Code Execution)๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ๋ฌธ๋œฉ ์ƒ๊ฐ์ด ๋‚ฌ์Šต๋‹ˆ๋‹ค: "Ren'Py ๊ฒŒ์ž„๋“ค์ด ์„ธ์ด๋ธŒ๋กœ Pickle์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋‚˜?" Pickle Python์—๋Š” Pickle์ด๋ผ๋Š” ์ง๋ ฌํ™”(serialization) ๋ฐฉ์‹์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Python์˜ (์™ ๋งŒํ•œ) ๋ชจ๋“  object๋ฅผ ์ง๋ ฌํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ์ง๋ ฌํ™”ํ•˜์ง€ ๋ชปํ•˜๋Š” object๊ฐ€ class์˜ property๋กœ ์กด์žฌํ•˜๋Š”๋ฐ, ์ด class๋ฅผ ์ง๋ ฌํ™”ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”? Python์€ ์ด๋ฅผ ์œ„ํ•ด __reduce__๋ผ๋Š” method๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” class๊ฐ€ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™” ๋  ๋•Œ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ class๋ฅผ ๋‹ค์‹œ ๊ตฌ์„ฑํ•ด์•ผํ• ์ง€ ๋ช…์‹œํ•ด์ค๋‹ˆ๋‹ค.์‚ฌ์šฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: class A: def __init__(self, a): self.a = a self.b = "b" def __reduce__(self): return self.__class__, (self.a,)# serializea = A()b = pickle.dumps(a) ๊ทธ๋Ÿฐ๋ฐ, ๋งŒ์•ฝ __reduce__์— ๋‹ค๋ฅธ Python ํ•จ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉด ์–ด๋–จ๊นŒ์š”? ์˜ˆ๋ฅผ ๋“ค์–ด, exec ๊ฐ™์€๊ฑฐ๋ผ๋ฉด ๋ง์ด์ฃ ? class Exploit: def __reduce__(self): return exec, ("print('Hello, World!'),)exploit = Exploit()a = pickle.dumps(exploit)pickle.loads(a) # Hello, World! ...๋„ค, Pickle์ด ๋กœ๋”ฉ๋  ๋•Œ ๋ฌธ์ž์—ด์— ๋‹ด๊ธด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค... ์ด๊ฒƒ์ด Python ๊ณต์‹ Pickle ๋ฌธ์„œ์—์„œ Pickle์ด ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค๊ณ  ํ•˜๋Š” ์ด์œ ๊ฒ ์ฃ . ์„ธ์ด๋ธŒ ํ•˜๋‚˜๋กœ Ren'Py ๊ฒŒ์ž„ ๊ฐ€์ง€๊ณ  ๋†€๊ธฐ ์ด์ œ Ren'Py๊ฐ€ Pickle์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์‚ฌ์‹ค๊ณผ, Pickle๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ์•˜์œผ๋‹ˆ, ์ง์ ‘ ์‹คํ–‰ํ•ด๋ณผ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค! Ren'Py์˜ ์„ธ์ด๋ธŒ๋Š” 1-1-LT1.save ๊ฐ™์€ ํŒŒ์ผ ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ‹์ ธ๋ณด์ด์ง€๋งŒ, ์‚ฌ์‹ค ๊ทธ๋ƒฅ Zip ํŒŒ์ผ์ด๋ฉฐ, ํ™•์žฅ์ž๋งŒ .save๋กœ ๋ณ€๊ฒฝ๋œ๊ฒ๋‹ˆ๋‹ค.์ด๋ฅผ ํ”ํ•œ Zip ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ํ’€์–ด๋ณด๋ฉด, ์—ฌ๋Ÿฌ ํŒŒ์ผ๋“ค์ด ๋‚˜์˜ค์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ๊ด€์‹ฌ์žˆ๋Š” ํŒŒ์ผ์€ log ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์ด Ren'Py์˜ Pickle์„ ๋‹ด๊ณ ์žˆ๋Š” ํŒŒ์ผ์ด์ฃ .์ด์ œ ์ด ํŒŒ์ผ์„ ์ œ๊ฐ€ ๋งŒ๋“  ์ฝ”๋“œ๊ฐ€ ๋‹ด๊ธด Pickle๋กœ ๋ฐ”๊ฟ”์น˜๊ธฐ ํ•˜๊ณ , ๋‹ค์‹œ ์••์ถ•์„ ํ•ด์„œ ๋„ฃ์œผ๋ฉด..? ์ฝ”๋“œ ์‹คํ–‰์ด ๋ฉ๋‹ˆ๋‹ค! ๋„ˆ๋ฌด ๋ฉ‹์ง€๋„ค์š”! ์ฝ”๋“œ ์‹คํ–‰์€ ๋˜๋Š”๋ฐ, ์ด์ œ ์–ด์ฉŒ์ฃ ? ์ด์ œ ์ฝ”๋“œ ์‹คํ–‰์ด ๋˜๋Š”๊ฑธ ์•Œ์•˜์œผ๋‹ˆ, ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ๋ฌด์—‡์ผ๊นŒ์š”? ๋‹น์—ฐํžˆ ๋ฉ”๋ชจ๋ฆฌ ์กฐ์ž‘์ด์ฃ ! Google์—์„œ ์ž ์‹œ ์กฐ์‚ฌํ•œ ๊ฒฐ๊ณผ unsafe-python ์ด๋ผ๋Š” ์ €์žฅ์†Œ๊ฐ€ ๋ˆˆ์— ๋“ค์–ด์™”์Šต๋‹ˆ๋‹ค. ์ด ์ €์žฅ์†Œ๋Š” Python์—์„œ ์ง์ ‘์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ทจ์•ฝ์ ์€ LOAD_CONST opcode๊ฐ€ ์•„๋ฌด ๋ฒ”์œ„ ๊ฒ€์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ด์šฉํ•˜์—ฌ ๊ฐ€์งœ PyObject๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ 0๋ถ€ํ„ฐ ์‚ฌ์‹ค์ƒ 64๋น„ํŠธ ์ฃผ์†Œ ๋์ž๋ฝ๊นŒ์ง€์˜ bytearray ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ง์ ‘์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋งŒ ์•Œ๋ฉด ์–ธ์ œ๋“ ์ง€ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๋ค์œผ๋กœ, Python์˜ ์‚ฌ๋ž‘์Šค๋Ÿฌ์šด slicing ๋ฌธ๋ฒ•์€ ์ด๋ฅผ ๋” ํŽธํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. # Assume we got raw memory bytearraymem = getmem()mem[0x18000000:0x18000008] = b'\0' * 8 ์ด์ œ ๋งˆ์Œ๋Œ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ์กฐ์ž‘๋„ ๊ฐ€๋Šฅํ•˜๊ณ , PyObject ์ƒ์„ฑ๋„ ๊ฐ€๋Šฅํ•˜๋‹ˆ, ์ €๋งŒ์˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•œ ํ›„ Python์˜ function ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ œ ์ฝ”๋“œ๋ฅผ ํ–ฅํ•˜๊ฒŒ ํ•˜๋ฉด ๋์ž…๋‹ˆ๋‹ค! ...๊ฐ€ ๋œ๋‹ค๋ฉด ์ •๋ง ์‰ฌ์šธ๊ฑด๋ฐ ๋ง์ด์ฃ ... ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ๊ถŒํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์—๋Š” ํŠน์ • ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Read, Write, eXecute ๊ถŒํ•œ์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋Š”๋ฐ, ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ execute ๊ถŒํ•œ ์—†์ด๋Š” ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์ฝ”๋“œ๋กœ์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋˜๋Š” ๋ถ€๋ถ„์€, ๋ณดํ†ต ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•˜๋Š” ์˜์—ญ์€ read์™€ write๋งŒ ์žˆ๊ณ , execute ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค! ๋งŒ์•ฝ execute ๊ถŒํ•œ์ด ์—†๋Š” ์˜์—ญ์„ ์‹คํ–‰ํ•˜๋ ค ํ•œ๋‹ค๋ฉด, CPU์—์„œ ๊ถŒํ•œ ๋ถ€์กฑ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ๊ฒƒ์ด๊ณ , ์ด๋Š” segfault๋กœ ์ด์–ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ํ˜„์žฌ ๋ถ€์กฑํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ถŒํ•œ์œผ๋กœ ์›ํ•˜๋Š” ๋ช…๋ น์„ ์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๋‹ต์€ ROP์— ์žˆ์Šต๋‹ˆ๋‹ค. ROP ROP, Return Oriented Programming์€ ๋ง ๊ทธ๋Œ€๋กœ asm์˜ ret ๋ช…๋ น์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ret ๋ช…๋ น์˜ ํŠน์ง•์€ ํ˜„์žฌ CPU๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” stack pointer(x86_64 ๊ธฐ์ค€ RSP register) ์— ์ ํžŒ ์ฃผ์†Œ ๊ฐ’์„ instruction pointer(x86_64 ๊ธฐ์ค€ RIP register)์— ์ ๊ณ  stack pointer๋ฅผ ์›€์ง์ธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ret๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋•Œ์— stack pointer๋ฅผ (์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์žˆ๋Š”) ์ €ํฌ๊ฐ€ ์›ํ•˜๋Š” ์ฝ”๋“œ๋กœ ํ–ฅํ•˜๊ฒŒ ํ•˜๋ฉด ์–ด๋–จ๊นŒ์š”?์ด๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„ , ret๋กœ ๋๋‚˜๋ฉด์„œ ์›ํ•˜๋Š” ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋ฏธ๋ฆฌ ์ฐพ์•„๋†“์•„์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์šฐ๋ฆฌ๋Š” gadget์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. Stack pointer์—์„œ๋„ ๊ถŒํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ ํ•˜์‹ค ์ˆ˜๋„ ์žˆ์ง€๋งŒ, stack pointer๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์€ read, write ๊ถŒํ•œ๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์ด ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ๋œ๋‹ค๋ฉด ์ด์ œ ์ด๋Ÿฐ ๊ตฌ์ƒ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: Python list๋ฅผ ํ†ตํ•ด custom stack์„ ๋งŒ๋“ ๋‹ค. Custom stack์—๋Š” ์ ์ ˆํžˆ gadget์„ ๋ฐฐ์น˜ํ•œ๋‹ค. Stack pointer๋ฅผ ์›ํ•˜๋Š” ์ฃผ์†Œ(์—ฌ๊ธฐ์„  Python list์˜ elements ์ฃผ์†Œ)๋กœ ๋ณ€๊ฒฝํ•˜๋Š” gadget์„ ํ–ฅํ•˜๋„๋ก ํ•œ Python function ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค. ํ•ด๋‹น Python function ๊ฐ์ฒด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. Stack pointer๊ฐ€ ์˜ฎ๊ฒจ์ง€๊ณ  ret๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉฐ ์›ํ•˜๋Š” ๋ช…๋ น์ด ์‹คํ–‰๋œ๋‹ค! ...๋งŽ์€ ๊ฒƒ๋“ค์ด ์ถ•์•ฝ๋˜์žˆ์ง€๋งŒ ๋Œ€๋žต์ ์œผ๋กœ ์ด๋Ÿฐ ๊ตฌ์ƒ์ด ๊ฐ€๋Šฅํ•˜์ฃ . ์ด์ œ ์ด๋ฅผ ์ด์šฉํ•ด์„œ ์ทจ์•ฝ์ ์„ ๋งŒ๋“ค ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค! Gadget ์ฐพ๊ธฐ ์•ž์„œ ๋งํ–ˆ๋“ฏ ROP๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„  ์ ์ ˆํ•œ gadget์„ ์ฐพ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์ด๋ฅผ ์œ„ํ•ด ROPgadget ํˆด์„ ์ด์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์›ํ•˜๋Š” executable๊ณผ ํ•จ๊ป˜ ํˆด์„ ์‹คํ–‰ํ•˜๋ฉด ret๋กœ ๋๋‚˜๋Š” ๋ชจ๋“  asm ๋ช…๋ น๋“ค์„ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ฐ’๊ณผ ํ•จ๊ป˜ ์ฐพ์•„์ค๋‹ˆ๋‹ค! (๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊นŒ์ง€ ๊ณ ๋ คํ•ด์„œ์š”!) ๋‹ค์Œ์—” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค: Executable ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ์œผ๋ฉฐ gadget ์ฃผ์†Œ๋ฅผ ๋™์ ์œผ๋กœ ์ฐพ๊ธฐ ๋ฏธ๋ฆฌ ํ•ด๋‹น gadget๋“ค์˜ ์ฃผ์†Œ๋ฅผ ์ ์–ด๋‘” dict ๋งŒ๋“ค๊ธฐ Xbox One/Series์—์„  1๋ฒˆ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ, PS์—์„  ํ›„์— ์–ธ๊ธ‰ํ•  ๋‚ด์šฉ ๋•Œ๋ฌธ์— 2๋ฒˆ ๋ฐฉ๋ฒ•์„ ์“ธ ์ˆ˜ ๋ฐ–์— ์—†์—ˆ์Šต๋‹ˆ๋‹ค. Stack pointer๋ฅผ ์›ํ•˜๋Š” ์ฃผ์†Œ๋กœ ์˜ฎ๊ธฐ๊ธฐ ์ด์ œ stack pointer๋ฅผ ๋งŒ๋“ค์–ด๋‘” Python list ์ฃผ์†Œ๋กœ ์˜ฎ๊ธฐ๋ฉด ๋˜๋Š”๋ฐ, ์–ด๋–ป๊ฒŒ ์˜ฎ๊ธธ๊นŒ์š”? ์ €ํฌ๊ฐ€ ์›ํ•˜๋Š”๊ฑด (x86_64 ๊ธฐ์ค€) mov rsp, ???์™€ ret์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ € ???๋ถ€๋ถ„์ด ์ค‘์š”ํ•œ๋ฐ, ์™œ๋ƒํ•˜๋ฉด Python function ํ˜ธ์ถœ์ด ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ์•Œ์•„์•ผํ•˜๋ฉฐ, ์‹คํ–‰๋˜๋Š” CPU์™€ OS์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ convention๋„ ์•Œ์•„์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ convention์ด๋ž€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋ช‡๋ฒˆ์งธ argument๊ฐ€ ์–ด๋–ค register์— ๋“ค์–ด๊ฐ€๋Š”์ง€๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค. Linux/UNIX ๊ธฐ๋ฐ˜ OS์˜ x86_64 ํ•จ์ˆ˜ ํ˜ธ์ถœ convention ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:RDI, RSI, RDX, RCX, R8, R9 ๊ทธ๋ฆฌ๊ณ  Python function ํ˜ธ์ถœ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค:function_call(PyObject* func, PyObject *arg, PyObject *kw) ๋”ฐ๋ผ์„œ ๋งŒ์•ฝ mov rsp, [rdi + 0x30]; ret ๋ผ๋Š” ๋ช…๋ น์„ ์ฐพ์•˜๋‹ค๋ฉด, ์ง์ ‘ ๋งŒ๋“œ๋Š” Python function ๊ฐ์ฒด ์•ˆ 0x30 ์ •๋„ ๋˜๋Š” ๊ณณ์— ์›ํ•˜๋Š” stack ์ฃผ์†Œ๋ฅผ ๋„ฃ์–ด์•ผํ•  ๊ฒƒ์ด๊ณ , mov rsp, [rsi + 0x10]; ret ๋ผ๋Š” ๋ช…๋ น์„ ์ฐพ์•˜๋‹ค๋ฉด, ์ง์ ‘ tuple ๊ฐ์ฒด๋ฅผ ๋งŒ๋“  ํ›„ 0x10 ์ •๋„ ๋˜๋Š” ๊ณณ์— stack ์ฃผ์†Œ๋ฅผ ์ €์žฅ, ๋งŒ๋“  function ๊ฐ์ฒด๋ฅผ ๋ถ€๋ฅผ ๋•Œ my_func(*custom_tuple)๊ณผ ๊ฐ™์ด ํ˜ธ์ถœํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค ๋งŒ๋“ค์—ˆ์œผ๋‹ˆ ์‹คํ–‰ํ•˜๋ฉด ๋˜๋Š”๋ฐ... Python์œผ๋กœ ๋ชป ๋Œ์•„์˜ค๊ณ  crash? ROP์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ๊ฑธ ๊นœ๋นกํ–ˆ๋„ค์š”. ์ง์ ‘ ๋งŒ๋“  stack์„ ์‹คํ–‰ํ•˜๊ณ  ๋‚˜์„  ๋‹ค์‹œ ์›๋ž˜ stack์œผ๋กœ ๋Œ์•„์™€์•ผ๊ฒ ์ฃ . ์ €๊ฐ™์€ ๊ฒฝ์šฐ๋Š” push rbp; mov rbp, rsp; xor esi, esi; call [rdi + 0x130] ๋ช…๋ น์„ ์ด์šฉํ•˜์—ฌ rbp์— rsp๋ฅผ ์ €์žฅํ•œ ํ›„ ์›ํ•˜๋Š” ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋„๋ก ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค(rdi + 0x130์—๋Š” stack pointer๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ช…๋ น์ด ์žˆ์Šต๋‹ˆ๋‹ค). ์ด ๋‹ค์Œ ์›ํ•˜๋Š” ๋ช…๋ น ์‹คํ–‰ ํ›„ mov rsp, rbp; pop rbp; ret ๋ช…๋ น์„ ํ†ตํ•ด ๋‹ค์‹œ ์›๋ž˜ stack pointer๋กœ ๋Œ์•„์˜ต๋‹ˆ๋‹ค.์ด๋ ‡๊ฒŒ๋งŒ ํ•˜๋ฉด ๋ ๊นŒ์š”..? ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Python์ด ํ•จ์ˆ˜์˜ return value(x86_64 ๊ธฐ์ค€ RAX register)๋ฅผ ์ฐธ์กฐํ•˜๋ ค๋‹ค ์ž˜๋ชป๋œ ๊ฐ’์„ ์ฐธ์กฐํ•˜์—ฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”? ์ •๋‹ต์€ None ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Python์—๊ฒŒ ์ •์ƒ์ ์ธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๋ฉฐ, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ๋„ค, None๋„ ํ•˜๋‚˜์˜ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.) ์ฃผ์˜ํ•  ์ ์€ None ๊ฐ์ฒด์˜ refcount๋ฅผ 1๋งŒํผ ์˜ฌ๋ ค์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Python์ด return value์˜ refcount๋ฅผ ์ค„์ด๋ ค ํ•  ๋•Œ, underflow ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๊นŒ์ง€ ๋งˆ์น˜๋ฉด, ์ง„์งœ๋กœ ์ €ํฌ๊ฐ€ ์›ํ•˜๋Š” ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค! Xbox์—์„œ ํ…Œ์ŠคํŠธ! Xbox One Research ํŒ€์˜ ๋„์›€์„ ๋ฐ›์•„ Ren'Py ๊ฒŒ์ž„ ํŒŒ์ผ์„ ๋ฐ›์€ ๋’ค gadget์„ ์ฐพ๊ณ , ๋Œ๋ ค๋ดค์Šต๋‹ˆ๋‹ค! Xbox์—์„œ ๋จผ์ € ํ…Œ์ŠคํŠธํ•œ ๊ฒฐ๊ณผ ์ •์ƒ์ ์œผ๋กœ socket์„ ์—ฌ๋Š”๋ฐ ์„ฑ๊ณตํ–ˆ์œผ๋ฉฐ, ํ•ด๋‹น socket์œผ๋กœ ๋‹ค๋ฅธ Python script๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค!(์ฐธ๊ณ ๋กœ ํ•ด๋‹น ๊ฒŒ์ž„์€ Python์˜ socket ๋ชจ๋“ˆ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.) Xbox ๊ฐ™์€ ๊ฒฝ์šฐ Windows์™€ ๊ฑฐ์˜ ๋น„์Šทํ•œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ํŽธํ•˜๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ง์˜ PS... ๊ทธ๋ ‡๊ฒŒ Xbox์—์„œ ํ…Œ์ŠคํŒ… ํ›„ ๋ช‡๋‹ฌ ๋’ค, PS ํ•ดํ‚น์—๋„ ๊ด€์‹ฌ์ด ์ƒ๊ฒจ ์•Œ์•„๋ณด๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ์•Œ๊ฒŒ๋œ Xbox์™€์˜ ์ฐจ์ด์ ์€... FreeBSD ๊ธฐ๋ฐ˜์˜ OS๋ฅผ ์‚ฌ์šฉํ•จ ์ž์ฒด์ ์ธ syscall๋“ค์ด ์กด์žฌํ•จ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ„ ์‹คํ–‰ ํŒŒ์ผ์—๋Š” ELF ํ•ด๋”๊ฐ€ ์—†์Œ(Import table ์•Œ ์ˆ˜ ์—†์Œ) ์‹คํ–‰ ํŒŒ์ผ์— ๊ธฐ๋ก๋œ ๋ชจ๋“ˆ๋งŒ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Œ PS5 ๊ธฐ์ค€: ์‹คํ–‰ ํŒŒ์ผ์ด ๋‹ด๊ธด ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์ฝ์„ ์ˆ˜ ์—†์Œ(XOM) ...Gadget ์ฐพ๊ธฐ์—์„œ 2๋ฒˆ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ ์ด์œ ๊ฐ€ XOM(eXecutable Only Memory) ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค PS4์—์„  1๋ฒˆ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ €๋Š” PS5 ๊ฒŒ์ž„๋„ ์ง€์›ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. PS5 Research & Development Discord ์„œ๋ฒ„์˜ ๋„์›€์„ ๋ฐ›์•„ ๊ฒŒ์ž„ ํŒŒ์ผ์„ ๋ฐ›์•˜๊ณ , ๋˜‘๊ฐ™์ด gadget์„ ์ฐพ์•„ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์œ„์— ์ ํžŒ ์ œ์•ฝ๋“ค์ด ์žˆ์–ด๋„, ๊ธฐ๋ณธ ์ž‘๋™์€ ๋น„์Šทํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฐ ๋ฌธ์ œ ์—†์ด ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ๊ณ , ๊ทธ๋ ‡๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ํ•œ ๊ฒฐ๊ณผ..! ์„ฑ๊ณต์ ์œผ๋กœ ์ž‘๋™๋˜์—ˆ๊ณ , yarpe๊ฐ€ ํƒ„์ƒํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ๋ฌด๋ฆฌ ์—ฌ๊ธฐ๊นŒ์ง€ ์˜ค๋Š”๋ฐ (์ค‘๊ฐ„์— ์‰ฌ์—ˆ์ง€๋งŒ) ๊ฑฐ์˜ 1๋…„์ด๋ผ๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ๋งŒ๋“ค๋ฉด์„œ ํž˜๋“  ๊ฒƒ ๋ณด๋‹จ ์žฌ๋ฐŒ๋‹ค๋Š” ๋А๋‚Œ์„ ๋” ๋งŽ์ด ๋ฐ›์•˜๋„ค์š”. (๋งŒ๋“œ๋Š” ๋™์•ˆ์€ ์ž ์ž๋Š” ์‹œ๊ฐ„๋งˆ์ € ์ค„์—ฌ๊ฐ€๋ฉฐ ๋งŒ๋“ค์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.) ๋งˆ๋ฌด๋ฆฌํ•˜๊ธฐ ์ „์—, ์ €์—๊ฒŒ ๋„์›€์ด ๋˜์—ˆ๋˜ ๋ถ„๋“ค์„ ์†Œ๊ฐœํ•˜๋ฉฐ ๋๋‚ด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. Xbox One Research ํŒ€: ์ด ํ”„๋กœ์ ํŠธ์˜ ์‹œ์ž‘์ ์ด ๋˜์–ด์ฃผ์—ˆ์œผ๋ฉฐ, ํ•ต์‹ฌ ๋ถ€๋ถ„์„ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ํฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (tuxuser, LukeFZ, Billy, harold๋‹˜ ๋“ฑ์ด ๋„์™€์ฃผ์…จ์Šต๋‹ˆ๋‹ค.) Dr.Yenyen: PS4/5 ๊ฒŒ์ž„๋“ค์˜ ํŒŒ์ผ์„ ์ œ๊ณตํ•ด์ฃผ์…จ๊ณ , ๋งŽ์€ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด์ฃผ์…จ์Šต๋‹ˆ๋‹ค. Gezine: ์ทจ์•ฝ์ ์„ ๊ฐœ๋ฐœํ•˜๋ฉฐ ์ œ๊ฐ€ ๊ถ๊ธˆํ–ˆ๋˜ ๋ถ€๋ถ„์ด๋‚˜ ์ž˜๋ชป๋œ ๋ถ€๋ถ„์„ ๋‹ต๋ณ€/์ง€์  ํ•ด์ฃผ์…จ์Šต๋‹ˆ๋‹ค. Sajjad: Dr.Yenyen๋‹˜๊ณผ ํ•จ๊ป˜ ๋งŽ์€ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด์ฃผ์…จ์Šต๋‹ˆ๋‹ค. cow: ์ง์ ‘ ํŒŒ์ผ ๋Œ€์กฐ๊นŒ์ง€ ํ•ด์ฃผ์‹œ๋ฉฐ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„์„ ๊ณ ์ณ์ฃผ์…จ์Šต๋‹ˆ๋‹ค. earthonion: ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด์ฃผ์…จ์œผ๋ฉฐ ๋งŽ์€ ์กฐ์–ธ์„ ํ•ด์ฃผ์…จ์Šต๋‹ˆ๋‹ค. ๊ธด ๊ธ€ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Hackers' Pub