What is Hackers' Pub?

Hackers' Pub is a place for software engineers to share their knowledge and experience with each other. It's also an ActivityPub-enabled social network, so you can follow your favorite hackers in the fediverse and get their latest posts in your feed.

1
1
0
0

๋‚˜๊ฐ€๊ธฐ์‹ซ์Šต๋‹ˆ๋‹ค ๊ฐ€์„œ ๋น„์‹ธ๊ณ  ์™• ๋ง›์žˆ๋Š” ๋ฐฅ ์–ป์–ด๋จน์ง€๋งŒ ...๊ทธ์ •๋„๋ฉด ใ„ฑใ…Š์€๊ฑฐ๊ฐ™์•„ ํ•œ๋ผ์— ๋ช‡๋งŒ์›ํ•˜๋Š”๊ฑฐ๊ฐ™์•—์–ด

0
0
1
0
0
0

Optique ๋ฌธ์„œ๋ฅผ ๋ณด๋‹ค๊ฐ€ argument ordering ํŒŒํŠธ์—์„œ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋‚˜ํƒ€๋‚œ(? appear) ์ˆœ์„œ๋Œ€๋กœ ํŒŒ์„œ๊ฐ€ ๋™์ž‘(? consume)ํ•œ๋‹ค๊ณ  ๋˜์–ด ์žˆ์–ด์„œ Object ํƒ€์ž…์ธ๋ฐ ์ด๊ฒŒ ์ž‘์„ฑํ•œ ์ˆœ์„œ๋Œ€๋กœ Object.entries() ๊ฐ™์€ ๊ณณ์—์„œ ์ˆœํšŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‚˜ ์˜๋ฌธ์ด ๋“ค์—ˆ๋‹ค(Object๊ฐ€ Map๊ฐ™์€ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์–ด์„œ).

์•„๋ž˜์™€ ๊ฐ™์ด ํƒ€๊ณ  ๊ฐ€๋ฉด:

  1. 20.1.2.5 Object.entries ( O ) (User call)
  2. 7.3.23 EnumerableOwnProperties ( O, kind ) (called by 2. Let entryList be ? EnumerableOwnProperties(obj, key+value).
  3. 10.1.11 [[OwnPropertyKeys]] ( ) (called by 1. Let ownKeys be ? O.[[OwnPropertyKeys]]().)
  4. 10.1.11.1 OrdinaryOwnPropertyKeys ( O ) (called by 1. Return OrdinaryOwnPropertyKeys(O).)

์•„๋ž˜์™€ ๊ฐ™์€ ๋Œ€๋ชฉ์„ ๋งŒ๋‚˜๋Š”๋ฐ:

  1. Let keys be a new empty List.
  2. For each own property key P of O such that P is an array index, in ascending numeric index order, do
    1. Append P to keys.
  3. For each own property key P of O such that P is a String and P is not an array index, in ascending chronological order of property creation, do
    1. Append P to keys.
  4. For each own property key P of O such that P is a Symbol, in ascending chronological order of property creation, do
    1. Append P to keys.
  5. Return keys.

๋งŒ์•ฝ key๊ฐ€ array index๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž์—ด ํ˜น์€ Symbol์ด๋ผ๋ฉด ํ”„๋กœํผํ‹ฐ ์ƒ์„ฑ ๋ฐœ์ƒ์˜ ์˜ค๋ฆ„์ฐจ์ˆœ ์ˆœ์„œ(? ascending chronological order of property creation)๋Œ€๋กœ ์ˆœํšŒ(?)ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ ํ˜€์žˆ๋‹ค.

์•„๋งˆ.. ์ž˜ ๋ชป ์ฐพ์•„์„œ ๋ชป ๋ณธ ๊ฑธ์ˆ˜๋„ ์žˆ์ง€๋งŒ chronological์ด๋‚˜ creation ๊ฐ™์ด ๊ฒ€์ƒ‰ํ–ˆ์„๋•Œ ์ŠคํŽ™์—์„œ ์ด๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•˜์ง€๋Š” ์•Š๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, PropertyDescriptor์ด auto increment ๋˜๋Š” ๊ณ ์œ  ID๋ฅผ ๊ฐ–๊ณ  ์žˆ์–ด์•ผ ํ•˜๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์ •๋ ฌํ•ด์•ผํ•œ๋‹ค, ๊ฑฐ๋‚˜?

์‹ค์ œ ๊ตฌํ˜„์„ ๋ณด๊ณ  ์‹ถ์–ด์„œ GitHub์— ์žˆ๋Š” V8 ๋ฏธ๋Ÿฌ๋กœ ๊ฐ€์„œ ๋ณด๋‹ˆ key๋“ค์„ OrderedHashSet์œผ๋กœ ๊ฐ–๊ณ  ์žˆ๋Š” ๋“ฏ ํ–ˆ๋‹ค. ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ๊ทธ๋Ÿฌ๋ฉด ๋˜๋„ค, ์‹ถ์–ด์„œ ๋”๋Š” ์•ˆ ์ฐพ์•„๋ดค๋‹ค.

์•”ํŠผ Optique ๋ฌธ์„œ๋Œ€๋กœ ์ƒ์„ฑ ์ˆœ์„œ๋Œ€๋กœ ๋™์ž‘ํ•  ๊ฒƒ ๊ฐ™๋‹ค!

3

์–ด์ œ ์†ก๋…„ํšŒ์—์„œ ์˜ค๋ผํด ์ด์•ผ๊ธฐ๊ฐ€ ๋„ˆ์™€์„œ ๋‚˜๋„ ์จ๋ณด๋ ค๊ณ  ํ•˜๋Š”๋ฐ... n8n์ด๋ผ๋„ ์˜ฌ๋ ค์•ผ๊ฒ ๋‹ค.

2
7
0
0

์‹ ๊ฒฝ์ฐจ๋‹จ ์ฃผ์‚ฌ ๋งž์œผ๋‹ˆ ๋นˆ๋„๋Š” ์ข€ ์ค„์–ด๋“ฌ. ์—†์–ด์ง€์ง„ ์•Š๋„ค... ๋‚˜๋จธ์ง€๋Š” ์ง„ํ†ต์†Œ์—ผ์ œ๋ž‘ ๊ทผ์ด์™„์ œ๋กœ ์–ด๋–ป๊ฒŒ ํ•ด ๋ด์•ผ.

0
0
0
0
0
0

ไปŠๆ—ฅใฏๅ‡บๆฅใ‚‹ใ ใ‘ๆ—ฉใไป•ไบ‹ใ‚’็ต‚ใ‚ใ‚‰ใ›ใฆswitch2ใ‚„ใ‚ŠใŸใ„ๆฐ—ๆŒใกโ€‹:menme_siosio:โ€‹

1

ๆดช ๆฐ‘ๆ†™ (Hong Minhee) shared the below article:

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

Helloyunho @helloyunho@hackers.pub

๋‹น์‹ ์€ ๊ฒŒ์ž„์— ๊ฐ‡ํžŒ ๋ฏธ์†Œ๋…€๋“ค์„ ๋ณด๊ธฐ ์œ„ํ•ด 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,)

# serialize
a = 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๋กœ ๋ฐ”๊ฟ”์น˜๊ธฐ ํ•˜๊ณ , ๋‹ค์‹œ ์••์ถ•์„ ํ•ด์„œ ๋„ฃ์œผ๋ฉด..?

Ren'Py์—์„œ ์ฝ”๋“œ ์‹คํ–‰!

์ฝ”๋“œ ์‹คํ–‰์ด ๋ฉ๋‹ˆ๋‹ค! ๋„ˆ๋ฌด ๋ฉ‹์ง€๋„ค์š”!

์ฝ”๋“œ ์‹คํ–‰์€ ๋˜๋Š”๋ฐ, ์ด์ œ ์–ด์ฉŒ์ฃ ?

์ด์ œ ์ฝ”๋“œ ์‹คํ–‰์ด ๋˜๋Š”๊ฑธ ์•Œ์•˜์œผ๋‹ˆ, ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ๋ฌด์—‡์ผ๊นŒ์š”? ๋‹น์—ฐํžˆ ๋ฉ”๋ชจ๋ฆฌ ์กฐ์ž‘์ด์ฃ ! Google์—์„œ ์ž ์‹œ ์กฐ์‚ฌํ•œ ๊ฒฐ๊ณผ unsafe-python ์ด๋ผ๋Š” ์ €์žฅ์†Œ๊ฐ€ ๋ˆˆ์— ๋“ค์–ด์™”์Šต๋‹ˆ๋‹ค. ์ด ์ €์žฅ์†Œ๋Š” Python์—์„œ ์ง์ ‘์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ทจ์•ฝ์ ์€ LOAD_CONST opcode๊ฐ€ ์•„๋ฌด ๋ฒ”์œ„ ๊ฒ€์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ด์šฉํ•˜์—ฌ ๊ฐ€์งœ PyObject๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ 0๋ถ€ํ„ฐ ์‚ฌ์‹ค์ƒ 64๋น„ํŠธ ์ฃผ์†Œ ๋์ž๋ฝ๊นŒ์ง€์˜ bytearray ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ง์ ‘์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์šฐ๋ฆฌ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋งŒ ์•Œ๋ฉด ์–ธ์ œ๋“ ์ง€ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๋ค์œผ๋กœ, Python์˜ ์‚ฌ๋ž‘์Šค๋Ÿฌ์šด slicing ๋ฌธ๋ฒ•์€ ์ด๋ฅผ ๋” ํŽธํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

# Assume we got raw memory bytearray
mem = 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 ๊ถŒํ•œ๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

์ด ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ๋œ๋‹ค๋ฉด ์ด์ œ ์ด๋Ÿฐ ๊ตฌ์ƒ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. Python list๋ฅผ ํ†ตํ•ด custom stack์„ ๋งŒ๋“ ๋‹ค.
  2. Custom stack์—๋Š” ์ ์ ˆํžˆ gadget์„ ๋ฐฐ์น˜ํ•œ๋‹ค.
  3. Stack pointer๋ฅผ ์›ํ•˜๋Š” ์ฃผ์†Œ(์—ฌ๊ธฐ์„  Python list์˜ elements ์ฃผ์†Œ)๋กœ ๋ณ€๊ฒฝํ•˜๋Š” gadget์„ ํ–ฅํ•˜๋„๋ก ํ•œ Python function ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.
  4. ํ•ด๋‹น Python function ๊ฐ์ฒด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. Stack pointer๊ฐ€ ์˜ฎ๊ฒจ์ง€๊ณ  ret๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉฐ ์›ํ•˜๋Š” ๋ช…๋ น์ด ์‹คํ–‰๋œ๋‹ค!

...๋งŽ์€ ๊ฒƒ๋“ค์ด ์ถ•์•ฝ๋˜์žˆ์ง€๋งŒ ๋Œ€๋žต์ ์œผ๋กœ ์ด๋Ÿฐ ๊ตฌ์ƒ์ด ๊ฐ€๋Šฅํ•˜์ฃ . ์ด์ œ ์ด๋ฅผ ์ด์šฉํ•ด์„œ ์ทจ์•ฝ์ ์„ ๋งŒ๋“ค ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค!

Gadget ์ฐพ๊ธฐ

์•ž์„œ ๋งํ–ˆ๋“ฏ ROP๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„  ์ ์ ˆํ•œ gadget์„ ์ฐพ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์ด๋ฅผ ์œ„ํ•ด ROPgadget ํˆด์„ ์ด์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์›ํ•˜๋Š” executable๊ณผ ํ•จ๊ป˜ ํˆด์„ ์‹คํ–‰ํ•˜๋ฉด ret๋กœ ๋๋‚˜๋Š” ๋ชจ๋“  asm ๋ช…๋ น๋“ค์„ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ฐ’๊ณผ ํ•จ๊ป˜ ์ฐพ์•„์ค๋‹ˆ๋‹ค! (๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊นŒ์ง€ ๊ณ ๋ คํ•ด์„œ์š”!)

๋‹ค์Œ์—” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  1. Executable ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ์œผ๋ฉฐ gadget ์ฃผ์†Œ๋ฅผ ๋™์ ์œผ๋กœ ์ฐพ๊ธฐ
  2. ๋ฏธ๋ฆฌ ํ•ด๋‹น 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์—์„œ ROP ํ›„ ์›ํ•˜๋Š” Python script ์‹คํ–‰!

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 ๊ตฌ๋™ ์„ฑ๊ณต!

์„ฑ๊ณต์ ์œผ๋กœ ์ž‘๋™๋˜์—ˆ๊ณ , yarpe๊ฐ€ ํƒ„์ƒํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ๋ฌด๋ฆฌ

์—ฌ๊ธฐ๊นŒ์ง€ ์˜ค๋Š”๋ฐ (์ค‘๊ฐ„์— ์‰ฌ์—ˆ์ง€๋งŒ) ๊ฑฐ์˜ 1๋…„์ด๋ผ๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ๋งŒ๋“ค๋ฉด์„œ ํž˜๋“  ๊ฒƒ ๋ณด๋‹จ ์žฌ๋ฐŒ๋‹ค๋Š” ๋А๋‚Œ์„ ๋” ๋งŽ์ด ๋ฐ›์•˜๋„ค์š”. (๋งŒ๋“œ๋Š” ๋™์•ˆ์€ ์ž ์ž๋Š” ์‹œ๊ฐ„๋งˆ์ € ์ค„์—ฌ๊ฐ€๋ฉฐ ๋งŒ๋“ค์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.)

๋งˆ๋ฌด๋ฆฌํ•˜๊ธฐ ์ „์—, ์ €์—๊ฒŒ ๋„์›€์ด ๋˜์—ˆ๋˜ ๋ถ„๋“ค์„ ์†Œ๊ฐœํ•˜๋ฉฐ ๋๋‚ด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

  • Xbox One Research ํŒ€: ์ด ํ”„๋กœ์ ํŠธ์˜ ์‹œ์ž‘์ ์ด ๋˜์–ด์ฃผ์—ˆ์œผ๋ฉฐ, ํ•ต์‹ฌ ๋ถ€๋ถ„์„ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ํฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (tuxuser, LukeFZ, Billy, harold๋‹˜ ๋“ฑ์ด ๋„์™€์ฃผ์…จ์Šต๋‹ˆ๋‹ค.)
  • Dr.Yenyen: PS4/5 ๊ฒŒ์ž„๋“ค์˜ ํŒŒ์ผ์„ ์ œ๊ณตํ•ด์ฃผ์…จ๊ณ , ๋งŽ์€ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด์ฃผ์…จ์Šต๋‹ˆ๋‹ค.
  • Gezine: ์ทจ์•ฝ์ ์„ ๊ฐœ๋ฐœํ•˜๋ฉฐ ์ œ๊ฐ€ ๊ถ๊ธˆํ–ˆ๋˜ ๋ถ€๋ถ„์ด๋‚˜ ์ž˜๋ชป๋œ ๋ถ€๋ถ„์„ ๋‹ต๋ณ€/์ง€์  ํ•ด์ฃผ์…จ์Šต๋‹ˆ๋‹ค.
  • Sajjad: Dr.Yenyen๋‹˜๊ณผ ํ•จ๊ป˜ ๋งŽ์€ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด์ฃผ์…จ์Šต๋‹ˆ๋‹ค.
  • cow: ์ง์ ‘ ํŒŒ์ผ ๋Œ€์กฐ๊นŒ์ง€ ํ•ด์ฃผ์‹œ๋ฉฐ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„์„ ๊ณ ์ณ์ฃผ์…จ์Šต๋‹ˆ๋‹ค.
  • earthonion: ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด์ฃผ์…จ์œผ๋ฉฐ ๋งŽ์€ ์กฐ์–ธ์„ ํ•ด์ฃผ์…จ์Šต๋‹ˆ๋‹ค.

๊ธด ๊ธ€ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Read more โ†’
5
0
0

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

Helloyunho @helloyunho@hackers.pub

๋‹น์‹ ์€ ๊ฒŒ์ž„์— ๊ฐ‡ํžŒ ๋ฏธ์†Œ๋…€๋“ค์„ ๋ณด๊ธฐ ์œ„ํ•ด 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,)

# serialize
a = 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๋กœ ๋ฐ”๊ฟ”์น˜๊ธฐ ํ•˜๊ณ , ๋‹ค์‹œ ์••์ถ•์„ ํ•ด์„œ ๋„ฃ์œผ๋ฉด..?

Ren'Py์—์„œ ์ฝ”๋“œ ์‹คํ–‰!

์ฝ”๋“œ ์‹คํ–‰์ด ๋ฉ๋‹ˆ๋‹ค! ๋„ˆ๋ฌด ๋ฉ‹์ง€๋„ค์š”!

์ฝ”๋“œ ์‹คํ–‰์€ ๋˜๋Š”๋ฐ, ์ด์ œ ์–ด์ฉŒ์ฃ ?

์ด์ œ ์ฝ”๋“œ ์‹คํ–‰์ด ๋˜๋Š”๊ฑธ ์•Œ์•˜์œผ๋‹ˆ, ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ๋ฌด์—‡์ผ๊นŒ์š”? ๋‹น์—ฐํžˆ ๋ฉ”๋ชจ๋ฆฌ ์กฐ์ž‘์ด์ฃ ! Google์—์„œ ์ž ์‹œ ์กฐ์‚ฌํ•œ ๊ฒฐ๊ณผ unsafe-python ์ด๋ผ๋Š” ์ €์žฅ์†Œ๊ฐ€ ๋ˆˆ์— ๋“ค์–ด์™”์Šต๋‹ˆ๋‹ค. ์ด ์ €์žฅ์†Œ๋Š” Python์—์„œ ์ง์ ‘์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ์ทจ์•ฝ์ ์€ LOAD_CONST opcode๊ฐ€ ์•„๋ฌด ๋ฒ”์œ„ ๊ฒ€์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ด์šฉํ•˜์—ฌ ๊ฐ€์งœ PyObject๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ 0๋ถ€ํ„ฐ ์‚ฌ์‹ค์ƒ 64๋น„ํŠธ ์ฃผ์†Œ ๋์ž๋ฝ๊นŒ์ง€์˜ bytearray ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ง์ ‘์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์šฐ๋ฆฌ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋งŒ ์•Œ๋ฉด ์–ธ์ œ๋“ ์ง€ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๋ค์œผ๋กœ, Python์˜ ์‚ฌ๋ž‘์Šค๋Ÿฌ์šด slicing ๋ฌธ๋ฒ•์€ ์ด๋ฅผ ๋” ํŽธํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

# Assume we got raw memory bytearray
mem = 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 ๊ถŒํ•œ๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

์ด ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ๋œ๋‹ค๋ฉด ์ด์ œ ์ด๋Ÿฐ ๊ตฌ์ƒ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. Python list๋ฅผ ํ†ตํ•ด custom stack์„ ๋งŒ๋“ ๋‹ค.
  2. Custom stack์—๋Š” ์ ์ ˆํžˆ gadget์„ ๋ฐฐ์น˜ํ•œ๋‹ค.
  3. Stack pointer๋ฅผ ์›ํ•˜๋Š” ์ฃผ์†Œ(์—ฌ๊ธฐ์„  Python list์˜ elements ์ฃผ์†Œ)๋กœ ๋ณ€๊ฒฝํ•˜๋Š” gadget์„ ํ–ฅํ•˜๋„๋ก ํ•œ Python function ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.
  4. ํ•ด๋‹น Python function ๊ฐ์ฒด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. Stack pointer๊ฐ€ ์˜ฎ๊ฒจ์ง€๊ณ  ret๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉฐ ์›ํ•˜๋Š” ๋ช…๋ น์ด ์‹คํ–‰๋œ๋‹ค!

...๋งŽ์€ ๊ฒƒ๋“ค์ด ์ถ•์•ฝ๋˜์žˆ์ง€๋งŒ ๋Œ€๋žต์ ์œผ๋กœ ์ด๋Ÿฐ ๊ตฌ์ƒ์ด ๊ฐ€๋Šฅํ•˜์ฃ . ์ด์ œ ์ด๋ฅผ ์ด์šฉํ•ด์„œ ์ทจ์•ฝ์ ์„ ๋งŒ๋“ค ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค!

Gadget ์ฐพ๊ธฐ

์•ž์„œ ๋งํ–ˆ๋“ฏ ROP๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„  ์ ์ ˆํ•œ gadget์„ ์ฐพ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์ด๋ฅผ ์œ„ํ•ด ROPgadget ํˆด์„ ์ด์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์›ํ•˜๋Š” executable๊ณผ ํ•จ๊ป˜ ํˆด์„ ์‹คํ–‰ํ•˜๋ฉด ret๋กœ ๋๋‚˜๋Š” ๋ชจ๋“  asm ๋ช…๋ น๋“ค์„ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ฐ’๊ณผ ํ•จ๊ป˜ ์ฐพ์•„์ค๋‹ˆ๋‹ค! (๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊นŒ์ง€ ๊ณ ๋ คํ•ด์„œ์š”!)

๋‹ค์Œ์—” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  1. Executable ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ์œผ๋ฉฐ gadget ์ฃผ์†Œ๋ฅผ ๋™์ ์œผ๋กœ ์ฐพ๊ธฐ
  2. ๋ฏธ๋ฆฌ ํ•ด๋‹น 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์—์„œ ROP ํ›„ ์›ํ•˜๋Š” Python script ์‹คํ–‰!

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 ๊ตฌ๋™ ์„ฑ๊ณต!

์„ฑ๊ณต์ ์œผ๋กœ ์ž‘๋™๋˜์—ˆ๊ณ , yarpe๊ฐ€ ํƒ„์ƒํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ๋ฌด๋ฆฌ

์—ฌ๊ธฐ๊นŒ์ง€ ์˜ค๋Š”๋ฐ (์ค‘๊ฐ„์— ์‰ฌ์—ˆ์ง€๋งŒ) ๊ฑฐ์˜ 1๋…„์ด๋ผ๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ๋งŒ๋“ค๋ฉด์„œ ํž˜๋“  ๊ฒƒ ๋ณด๋‹จ ์žฌ๋ฐŒ๋‹ค๋Š” ๋А๋‚Œ์„ ๋” ๋งŽ์ด ๋ฐ›์•˜๋„ค์š”. (๋งŒ๋“œ๋Š” ๋™์•ˆ์€ ์ž ์ž๋Š” ์‹œ๊ฐ„๋งˆ์ € ์ค„์—ฌ๊ฐ€๋ฉฐ ๋งŒ๋“ค์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.)

๋งˆ๋ฌด๋ฆฌํ•˜๊ธฐ ์ „์—, ์ €์—๊ฒŒ ๋„์›€์ด ๋˜์—ˆ๋˜ ๋ถ„๋“ค์„ ์†Œ๊ฐœํ•˜๋ฉฐ ๋๋‚ด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

  • Xbox One Research ํŒ€: ์ด ํ”„๋กœ์ ํŠธ์˜ ์‹œ์ž‘์ ์ด ๋˜์–ด์ฃผ์—ˆ์œผ๋ฉฐ, ํ•ต์‹ฌ ๋ถ€๋ถ„์„ ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ํฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (tuxuser, LukeFZ, Billy, harold๋‹˜ ๋“ฑ์ด ๋„์™€์ฃผ์…จ์Šต๋‹ˆ๋‹ค.)
  • Dr.Yenyen: PS4/5 ๊ฒŒ์ž„๋“ค์˜ ํŒŒ์ผ์„ ์ œ๊ณตํ•ด์ฃผ์…จ๊ณ , ๋งŽ์€ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด์ฃผ์…จ์Šต๋‹ˆ๋‹ค.
  • Gezine: ์ทจ์•ฝ์ ์„ ๊ฐœ๋ฐœํ•˜๋ฉฐ ์ œ๊ฐ€ ๊ถ๊ธˆํ–ˆ๋˜ ๋ถ€๋ถ„์ด๋‚˜ ์ž˜๋ชป๋œ ๋ถ€๋ถ„์„ ๋‹ต๋ณ€/์ง€์  ํ•ด์ฃผ์…จ์Šต๋‹ˆ๋‹ค.
  • Sajjad: Dr.Yenyen๋‹˜๊ณผ ํ•จ๊ป˜ ๋งŽ์€ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด์ฃผ์…จ์Šต๋‹ˆ๋‹ค.
  • cow: ์ง์ ‘ ํŒŒ์ผ ๋Œ€์กฐ๊นŒ์ง€ ํ•ด์ฃผ์‹œ๋ฉฐ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„์„ ๊ณ ์ณ์ฃผ์…จ์Šต๋‹ˆ๋‹ค.
  • earthonion: ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด์ฃผ์…จ์œผ๋ฉฐ ๋งŽ์€ ์กฐ์–ธ์„ ํ•ด์ฃผ์…จ์Šต๋‹ˆ๋‹ค.

๊ธด ๊ธ€ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Read more โ†’
5
0

์–ด์šฐ ์ผ์ฐ ์ž๋„ ์•„์นจ ๋จน๊ณ  ์ž๋‹ˆ๊นŒ ๋˜ ์˜ค์ „ ์‹œ๊ฐ„ ๋‚ ๋ ค๋ฒ„๋ ธ์ž–์•„ ใ… ใ…  ๋‚ฎ์ž ์„ ๊ทธ๋ƒฅ ์•ˆ ์ž์•ผ๋งŒโ€ฆ ๊ทผ๋ฐ ๋˜ ์•ˆ ์ž๋ฉด ํ”ผ๊ณคํ•ด

0
1
0
0
1

ๆŽจๅ€‹๏ผšๅก”ๅจœ๏ผŽๆณ•่˜ญ็ชใ€Œ้ƒฝๆŸๆž—ๅ‡ถๆกˆๅฐ้šŠใ€็ณปๅˆ— ๏ผˆๆฒ’ๆœ‰ๅЇ้€๏ผŒๅชๆ˜ฏ้•ท๏ผ‰

ๆœ€ๅˆๅœจใ€Œๆฏๆ—ฅๅ„ชๆƒ ใ€็œ‹ๅˆฐใ€Š้ƒฝๆŸๆž—ๅ‡ถๆกˆๅฐ้šŠใ€‹ไธ€ๆ—ฅ็‰นๅƒนๆ™‚๏ผŒๅ› ็‚บไธ่ช่ญ˜้€™ๅฅ—ๆ›ธ๏ผŒๅŽŸๆœฌไธฆๆฒ’ๆœ‰ๆ‰“็ฎ—่ณผ่ฒท๏ผ›ๆฒ’ๆƒณๅˆฐๆดปๅ‹•ๅ‰ไธ€ๅคฉ้–‹ๅง‹ๆŽจ่–ฆๆ–‡ๅฆ‚้›จๅพŒๆ˜ฅ็ญๅ†’ๅ‡บไพ†๏ผŒๆ›ดๆœ‰ๅนพๅ‰‡่กจ็คบๆ•ดๅฅ—999้€™ๅƒนๆ ผ้Œฏ้Žไธๅ†ๆœ‰๏ผˆ้‚„ๅฏไปฅ็–Š375๏ผ๏ผ‰๏ผŒๆ‰€ไปฅๅ่ฆ†ๆŽ™ๆ‰ŽๅพŒ๏ผŒ้‚„ๆ˜ฏๅ’ฌ็‰™่ฒทไบ†ใ€‚

ๆ‰“้–‹็ฌฌไธ€้›†ใ€Š็ฅž็ฅ•ๆฃฎๆž—ใ€‹็œ‹ไบ†ๅนพ้ ๅพŒโ€”โ€”ๆœ‰่ฒทๅˆฐ็œŸๆ˜ฏๅคชๅฅฝไบ†๏ผ

ๆ‰่ฎ€ๅฎŒใ€Œๆฅ”ๅญใ€ๆˆ‘ๅฐฑๅ–œๆญกไธŠ้€™ๆœฌๆ›ธไบ†ใ€‚
ๅŽŸไฝœ็‡Ÿ้€ ็š„ๆฐฃๅœใ€่ญฏ่€…ๅ„ช็พŽ็š„่ญฏๆ–‡้ƒฝๅฅฝๆฃ’ใ€‚
๏ผˆ้‚„ๆœ‰ๅพˆ็”จๅฟƒ็š„ๅญ—ๅž‹ๆ•ˆๆžœใ€‚๏ผ‰
็œ‹ๅฎŒ็ฌฌไธ€ๆœฌ็š„ๆ™‚ๅ€™ๅฐฑๆ˜ฏใ€Œๅ“‡๏ผŒ้€™ๆ˜ฏๅฏไปฅ็”จ้€™ๅ€‹ๅƒนๆ ผ่ฒทๅˆฐ็š„ๅ—Ž๏ผŸใ€

้€™็ณปๅˆ—ๅ„ๅ†Š็š„ๅญ—ๆ•ธไนŸๅพˆ้ฉšไบบ๏ผŒๅปขๅฏขๅฟ˜้ฃŸๅœฐ็œ‹ไนŸๆ‰็œ‹ๅฎŒไธ‰ๆœฌ๏ผ›่ฆ่ฎ€ๅฎŒ้€™ไธ€ๅฅ—ๅ…ญๆœฌๆ‡‰่ฉฒไธๅช2500ๅˆ†้˜ๅง๏ผŸๆƒ…็ฏ€่จญ่จˆ่ฎ“ไบบๆฌฒ็ฝทไธ่ƒฝ๏ผŒไฝ†ไธ€ๆœฌๅญ—ๆ•ธๅˆๅฅฝๅคš๏ผŒๅˆฐๅบ•ๆ˜ฏ่ฆ็นผ็บŒ็œ‹ไธ‹ไธ€ๆœฌ๏ผŒ้‚„ๆ˜ฏๅ…ˆไผ‘ๆฏ็ทฉไธ€้™ฃๅญๆŠŠๅพŒ้ข้›†ๆ•ธ็•™ๅˆฐๆ˜Žๅนดๆดปๅ‹•ๅ†็นผ็บŒ่ฎ€๏ผŒๅฅฝๆŽ™ๆ‰Žๅ•Š๏ฝž

็ธฝไน‹๏ผŒ่ฌ่ฌ้™ๆ™‚็‰นๅƒน๏ผŒ่ฌ่ฌ็พคๆ˜Ÿๆ–‡ๅŒ–่ฒทไบ†้›ปๅญๆ›ธ็‰ˆๆฌŠ๏ผŒ่ฌ่ฌ็š‡ๅ† ๆ–‡ๅŒ–ๆŽˆๆฌŠ่ญฏๆ–‡๏ผŒ่ฌ่ฌ็ถฒๅ‹ๅ€‘็š„ๅคงๅŠ›ๆŽจ่–ฆ๏ผŒ่ฎ“ๆˆ‘่ƒฝไปฅๅฅฝๅฏฆๆƒ ็š„ๅƒนๆ ผ็œ‹ๅˆฐ้€™็ณปๅˆ—ไฝœๅ“ใ€‚

0

:meowcry:

ใ‚ชใƒผใƒ—ใƒณใชๆ‰“ใกๅˆใ‚ใ›ใ‚นใƒšใƒผใ‚นใง
ๆ„Ÿๆƒ…ๅ‡บใ—ใฆๆ€’ใ‚‹ใฎใ‚„ใ‚ใฆใใ‚Œ๏ฝค๏ฝค๏ฝค
โ€‹:meowcry:โ€‹
ๅˆฅใฎใ‚จใƒชใ‚ขใซ้€ƒใ’ใฆใใŸ
โ€‹:blobcatpensive:โ€‹

1
0
2
1
1

Sunset Solstice over Stonehenge

Yesterday the Sun reached its southernmost point in planet Earth's sky. Called a solstice, many cultures mark yesterday's date as a change of seasons -- from autumn to winter in Earth's Northern Hemisphere and from spring to summer in Earth's Southern Hemisphere. The featured image was taken just before the longest night of the 2025 northern year at Stonehenge in United Kingdom.

English Heritage, Josh Dury





There, through stones precisely placed 4,500 years ago, a 4.5 billion year old large glowing orb is seen setting. Even given the precession of the Earth's rotational axis over the millennia, the Sun continues to set over Stonehenge in an astronomically significant way.
0
0
0
0

ํ•ด๋ฐฉ ์งํ›„ ํ˜ผ๋ž€๊ธฐ์— ์ด๋ฅธ๋ฐ” โ€˜์กฐ์„ ์ •ํŒ์‚ฌ ์œ„์กฐ์ง€ํ ์‚ฌ๊ฑดโ€™ ์ฃผ๋ชจ์ž๋กœ ๋ชฐ๋ ค ๋ฌด๊ธฐ์ง•์—ญ์„ ์„ ๊ณ ๋ฐ›๊ณ  ํ•œ๊ตญ์ „์Ÿ ์ค‘ ์ฒ˜ํ˜•๋œ ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ง„ ๋…๋ฆฝ์šด๋™๊ฐ€ ๊ณ  ์ด๊ด€์ˆ  ์„ ์ƒ์ด ์žฌ์‹ฌ์—์„œ 79๋…„ ๋งŒ์— ๋ฌด์ฃ„๋ฅผ ์„ ๊ณ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

79๋…„ ๋งŒ์˜ ๋ช…์˜ˆํšŒ๋ณตโ€ฆโ€˜์กฐ์„ ์ •ํŒ์‚ฌ ์‚ฌ๊ฑดโ€™ ์ด๊ด€์ˆ  ์„ ์ƒ ...

0
0
0

ๅฎใใ˜ๅฝ“ใฆใฆใ‚‚ใŠ้‡‘ไฝฟใ„ใ™ใŽใฆไธๅนธใซใชใ‚‹ไบบๅคšใ„ใ‚‰ใ—ใ„ใ‹ใ‚‰ใ€ๅฝ“้ธ้‡‘ใ‚’ไปฃใ‚ใ‚Šใซๅ—ใ‘ๅ–ใฃใฆใ‚ใ’ใŸใ„โ€ฆ

1
0
0

SECO1ใฎๆ™‚็‚นใ‹ใ‚‰27็ง’็Ÿญใใฆใ‚บใƒฌใฆใ„ใŸใฎใ‹ใ€‚SELI2ใŒ15็ง’ๆ—ฉใ่กŒใ‚ใ‚ŒใŸใŒใ™ใๆญขใพใฃใŸใ€ใ‚ˆใ‚Šใ‚‚ใ—ใ‚“ใฉใ„ใ€‚ใ†ใƒผใ‚“ใ€ๅฎŸ็ธพใฎใ‚ใ‚‹ใฏใšใฎLE-5B็ณปๅˆ—ใงใ‚‚ใ€ใ„ใ‚„ใ€ใ ใ‹ใ‚‰ใ“ใไฝ•ใ‹ใŒ้š ใ‚Œใฆใ„ใ‚‹ใ‚“ใ ใ‚ใ†ใ‹โ€ฆ

0
1

์–ด๋–ค ์ฐ์„ ๋ดค๋‹ค
ํฐ์„ ์ดˆ๊ธฐํ™” ํ•ด์•ผํ•˜๋Š”๋ฐ ์•ˆ๋˜์„œ ๋Œ€๋ฆฌ์  ๋ฐฉ๋ฌธํ•˜๊ณ  ํ•œ ๋ง์”€
"ํ•ธ๋“œํฐ ์ดˆํ† ํ™” ์‹œ์ผœ ์ฃผ์„ธ์š”"

0
1
0

๋ฐฉ๊ธˆ ๊ฐˆ์•„๋ฒ„๋ฆฐ ๋ฉ”๋ฅดํ—จ๋‹˜์˜ ๋‘ ๋ฟ”์€
ํšŒ๋ถ„ํ•จ๋Ÿ‰์ด ๊ธฐ์ค€์น˜ 0.5% ์ดˆ๊ณผํ•ด์„œ
๋‹น๊ตญ์— ์ „๋Ÿ‰ํ๊ธฐ๋ฅผ ์ง€์‹œํ•˜์˜€์๋‹ˆ๋‹ค

0