Stack frame
date
May 5, 2023
slug
stack-frame
status
Published
tags
Pwnable
summary
type
Post
μ μ½λλ
main
ν¨μ λ΄μμ qwe
ν¨μλ₯Ό νΈμΆνκ³ μμΌλ©° qwe
ν¨μ λ΄μμ qweqwe
ν¨μλ₯Ό νΈμΆνκ³ μλ€.buf
μλ aaaaaaaaaaaa, buff
μλ bbbbbbbbbbbb, bufff
μλ ccccccccccccλ₯Ό μ
λ ₯ν μμ μ΄λ€. (12λ°μ΄νΈ)main
ν¨μμ μ μ ν κ³³μ breakpointλ₯Ό μ€μ νκ³ μ€νν΄λ³΄μ. (μ
λ ₯μ λ°λ get ν¨μ νΈμΆ μ )call qwe
λ₯Ό νΈμΆνκΈ° μ κΉμ§ μ΄λν΄λ³΄μ (gdb λͺ
λ Ήμ΄μΈ nμ μ
λ ₯νλ©΄ λλ€.)qwe
ν¨μ λ΄λΆμ μ΄μ
λΈλ¦¬ μ½λλ‘ λ€μ΄κ°κΈ° μν΄μ s(step) λͺ
λ Ήμ΄λ₯Ό μ¬μ©ν΄λ³΄μ.n(next) λͺ
λ Ήμ΄λ₯Ό μ¬μ©νλ©΄
main
ν¨μμ λ€μ μ½λ(main+73
)κ° μ€νλλ€. (μ΄μ μ¬μ§ μ°Έκ³ )RSP: 0x7fffffffdde8, RBP: 0x7fffffffde00
n(next) λͺ
λ Ήμ΄λ₯Ό νλμ© μ¬μ©ν΄λ³΄λ©΄μ μ€ν νλ μμ λμ κ³Όμ μ νμΈν΄λ³΄μ.
pwndbgμ μκ°ν κ²°κ³Όλ₯Ό 보면 μ€νμ λ°μμ μλ‘ μμ΄λ©΄μ μ£Όμκ° μμμ§κ³ μλ€. μ΄λ RBPλ μ€νμ 맨 μλμΈ μμμ μ΄λ©°, RSPλ μ€νμ κΌλκΈ°μ΄λ€.
RBPλ μ€νμ μμ μ£Όμκ° μ μ₯λμ΄ μμΌλ©°, RSPλ κΌλκΈ°μμ μ£Όμλ₯Ό λΉΌλ©΄μ μ€νμ ν보νκ² λλ€.
RSP: 0x7fffffffdde8 -> 0x7fffffffdde0, RBP: 0x7fffffffde00
push rbp
λͺ
λ Ήμ μννμ λ RSP μ£Όμκ° -8 λμκ³ μ΄ μ£Όμ(0x7fffffffdde0)μλ μ΄μ μ€ν νλ μ μ£Όμ (0x7fffffffde00)κ° μ μ₯(push)λλ€.μ¦
main
μΌλ‘ λμκ° λ 볡ꡬν μ€νμ μ£Όμλ₯Ό λ©λͺ¨λ¦¬μ 보κ΄νλ€. (main
μμ qwe
λ₯Ό νΈμΆνμΌλκΉ qwe
μ μν μ΄ λλ νμ main
μμ νλ μΌμ λ§μ ν΄μΌνλ€.)RSP: 0x7fffffffdde0, RBP: 0x7fffffffdde0
μ΄μ
qwe
ν¨μμμ μλ‘κ² μ¬μ©ν μ€ν 곡κ°μ μ¬μ©νκΈ° μν΄ mov rbp, rsp
λ₯Ό μννμ¬ RSPμ RBPλ₯Ό κ°κ² νλ€.RSP: 0x7fffffffdde0 -> 0x7fffffffddd0, RBP: 0x7fffffffdde0
sub rsp, 0x10
μ μννμ¬ 16λ°μ΄νΈλ§νΌ μ€νμ 곡κ°μ΄ ν보λμλ€. ν΄λΉ ν¨μμ λͺ¨λ μ½λλ₯Ό μνν ν leave(mov rsp, rbp; pop rbp) ret;
μ ν΅ν΄ μ΄μ μ€ν νλ μ μ£Όμλ‘ λμκ°λ€.μ΄μ κ³Ό λμΌν λ°©λ²μΌλ‘ nκ³Ό s λͺ
λ Ήμ΄λ₯Ό μ μ νκ² μ¬μ©νμ¬
qweqwe
ν¨μκΉμ§ λ€μ΄κ°λ³΄μ!qweqwe
ν¨μμ μλ gets
ν¨μκΉμ§ μ€ννλ€λ©΄ μ΄ 3λ²μ μ
λ ₯μ λ£μλ€.μ΄μ λ©λͺ¨λ¦¬μ μ΄λ»κ² λ°μ΄ν°κ° μ μ₯λμ΄ μλμ§ νμΈν΄λ³΄μ.
νμ¬
qweqwe
ν¨μλ₯Ό μν μ€μΈ μνμ΄λ€.RSP λ μ§μ€ν° μ£Όμμ λ©λͺ¨λ¦¬μ λ¨μμλ κ°μ 보면 0x63(c)λ₯Ό 12λ² μ
λ ₯ν κ°μ΄ μ μ₯λμ΄ μλ€.
12λ² μ
λ ₯νμΌλ―λ‘ λ§μ§λ§ 4λ°μ΄νΈλ 0x00000000μΌλ‘ λμ΄μλ€. (16λ°μ΄νΈ 곡κ°μ ν보νκΈ° λλ¬Έμ΄λ€.)
λ€μμΌλ‘ 0x7fffffffddd0μ λ°νν μμ μΈ μ΄μ ν¨μ μ€νμ μμμ SFP(Stack Frame Pointer) μ£ΌμμΈ κ²μ΄λ€.
λ§μ§λ§μΌλ‘ 0x4011d5λ
qwe
ν¨μλ₯Ό μ΄μ΄μ μννκΈ° μν return μ£Όμμ΄λ€.0x7fffffffddd0μ λ©λͺ¨λ¦¬λ₯Ό νμΈν΄λ³΄λ 0x7fffffffddf0μ κ°λ¦¬ν€κ³ μλ€.
ν΄λΉ μ£Όμμμ bufμ ν¬κΈ°(16)λ§νΌ λ§μ΄λμ€ν λ©λͺ¨λ¦¬ μ£Όμλ₯Ό νμΈν΄λ³΄λ©΄ 0x62(b)λ₯Ό μ
λ ₯ν κ°μ΄ μ μ₯λμ΄ μλ€.
return μ£ΌμμΈ 0x4011d5λ₯Ό νμΈν΄λ³΄λ
qwe+51
μ κ°λ¦¬ν€κ³ μλ€.qwe+51
μ call qweqwe
λ₯Ό μνν ν λ€μμΌλ‘ μ€νν΄μΌ νλ μ£Όμμ΄λ€.0x7fffffffddf0 λ©λͺ¨λ¦¬λ₯Ό 보λ 0x1μ΄ μλ€. λ μ΄μ μ°κ²°λ μ€ν νλ μμ΄ μ‘΄μ¬νμ§ μλ€.
return μ£ΌμμΈ 0x401221λ₯Ό νμΈν΄λ³΄λ
main+73
μ κ°λ¦¬ν€κ³ μλ€.main+73
μ call qwe
λ₯Ό μνν ν λ€μμΌλ‘ μ€νν΄μΌ νλ μ£Όμμ΄λ€.μ 리
SFP μ£Όμκ° 0x7fffffddb0(qweqwe) -> 0x7fffffffddd0 (qwe) -> 0x7fffffffddf0 (main)μ²λΌ μλ‘ μ°κ²°λμ΄ μμμ νμΈν μ μμλ€.
push rbp
λ₯Ό ν΅ν΄ μ΄μ ν¨μ μ€νμ μμμ μ λ©λͺ¨λ¦¬μ 보κ΄νκ³ , μλ‘κ² μ¬μ©ν μ€νμ μ£Όμλ₯Ό μ€μ (mov rbp, rsp
)νκ³ λμ ν¨μκ° μ€νλλ€.ν΄λΉ ν¨μλ₯Ό λ§λ¬΄λ¦¬νκ³ λΉ μ Έλμ¬ λ λ©λͺ¨λ¦¬μ 보κ΄νλ μ£Όμλ‘ μ€νμ μμμ μ 볡ꡬνλ€.
κ·Έλ€μ μ΄μ΄μ μνν λͺ
λ Ήμ΄μΈ RET μ£Όμλ₯Ό μ€ννλ€.