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.
๐ฎ 'Time to Explain!'
a game by falafelovore
France
๐ฅ A time loop puzzle game about communication.
๐ง Will you manage to manage time in 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
๋ฏธ์๋ ๋ณด๋ ค๊ณ ๋ฏธ์ฐ์๋ฅผ ์ผฐ๋๋ ๊ฒ์ ์ฝ์์ด ํดํน๋นํ์ด์
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: ํ ์คํธ๋ฅผ ์งํํด์ฃผ์ จ์ผ๋ฉฐ ๋ง์ ์กฐ์ธ์ ํด์ฃผ์ จ์ต๋๋ค. ๊ธด ๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.