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λ°”μ΄νŠΈ)
notion image
mainν•¨μˆ˜μ˜ μ μ ˆν•œ 곳에 breakpointλ₯Ό μ„€μ •ν•˜κ³  μ‹€ν–‰ν•΄λ³΄μž. (μž…λ ₯을 λ°›λŠ” get ν•¨μˆ˜ 호좜 μ „)
notion image
call qweλ₯Ό ν˜ΈμΆœν•˜κΈ° μ „κΉŒμ§€ μ΄λ™ν•΄λ³΄μž (gdb λͺ…령어인 n을 μž…λ ₯ν•˜λ©΄ λœλ‹€.)
notion image
qweν•¨μˆ˜ λ‚΄λΆ€μ˜ μ–΄μ…ˆλΈ”λ¦¬ μ½”λ“œλ‘œ λ“€μ–΄κ°€κΈ° μœ„ν•΄μ„œ s(step) λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•΄λ³΄μž.
n(next) λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ mainν•¨μˆ˜μ˜ λ‹€μŒ μ½”λ“œ(main+73)κ°€ μ‹€ν–‰λœλ‹€. (이전 사진 μ°Έκ³ )
notion image
RSP: 0x7fffffffdde8, RBP: 0x7fffffffde00
n(next) λͺ…λ Ήμ–΄λ₯Ό ν•˜λ‚˜μ”© μ‚¬μš©ν•΄λ³΄λ©΄μ„œ μŠ€νƒ ν”„λ ˆμž„μ˜ λ™μž‘ 과정을 ν™•μΈν•΄λ³΄μž.
pwndbg의 μ‹œκ°ν™” κ²°κ³Όλ₯Ό 보면 μŠ€νƒμ€ λ°‘μ—μ„œ μœ„λ‘œ μŒ“μ΄λ©΄μ„œ μ£Όμ†Œκ°€ μž‘μ•„μ§€κ³  μžˆλ‹€. μ΄λ•Œ RBPλŠ” μŠ€νƒμ˜ 맨 μ•„λž˜μΈ μ‹œμž‘μ μ΄λ©°, RSPλŠ” μŠ€νƒμ˜ κΌ­λŒ€κΈ°μ΄λ‹€.
RBPλŠ” μŠ€νƒμ˜ μ‹œμž‘ μ£Όμ†Œκ°€ μ €μž₯λ˜μ–΄ 있으며, RSPλŠ” κΌ­λŒ€κΈ°μ—μ„œ μ£Όμ†Œλ₯Ό λΉΌλ©΄μ„œ μŠ€νƒμ„ ν™•λ³΄ν•˜κ²Œ λœλ‹€.
RSP: 0x7fffffffdde8 -> 0x7fffffffdde0, RBP: 0x7fffffffde00
notion image
push rbp λͺ…령을 μˆ˜ν–‰ν–ˆμ„ λ•Œ RSP μ£Όμ†Œκ°€ -8 λ˜μ—ˆκ³  이 μ£Όμ†Œ(0x7fffffffdde0)μ—λŠ” 이전 μŠ€νƒ ν”„λ ˆμž„ μ£Όμ†Œ (0x7fffffffde00)κ°€ μ €μž₯(push)λœλ‹€.
즉 main으둜 λŒμ•„κ°ˆ λ•Œ 볡ꡬ할 μŠ€νƒμ˜ μ£Όμ†Œλ₯Ό λ©”λͺ¨λ¦¬μ— λ³΄κ΄€ν•œλ‹€. (mainμ—μ„œ qweλ₯Ό ν˜ΈμΆœν–ˆμœΌλ‹ˆκΉŒ qwe의 역할이 λλ‚œ 후에 mainμ—μ„œ ν•˜λ˜ 일을 λ§ˆμ € ν•΄μ•Όν•œλ‹€.)
notion image
RSP: 0x7fffffffdde0, RBP: 0x7fffffffdde0
이제 qweν•¨μˆ˜μ—μ„œ μƒˆλ‘­κ²Œ μ‚¬μš©ν•  μŠ€νƒ 곡간을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ mov rbp, rspλ₯Ό μˆ˜ν–‰ν•˜μ—¬ RSP와 RBPλ₯Ό κ°™κ²Œ ν•œλ‹€.
notion image
RSP: 0x7fffffffdde0 -> 0x7fffffffddd0, RBP: 0x7fffffffdde0
sub rsp, 0x10을 μˆ˜ν–‰ν•˜μ—¬ 16λ°”μ΄νŠΈλ§ŒνΌ μŠ€νƒμ˜ 곡간이 ν™•λ³΄λ˜μ—ˆλ‹€. ν•΄λ‹Ή ν•¨μˆ˜μ˜ λͺ¨λ“  μ½”λ“œλ₯Ό μˆ˜ν–‰ν•œ ν›„ leave(mov rsp, rbp; pop rbp) ret;을 톡해 이전 μŠ€νƒ ν”„λ ˆμž„ μ£Όμ†Œλ‘œ λŒμ•„κ°„λ‹€.
notion image
이전과 λ™μΌν•œ λ°©λ²•μœΌλ‘œ nκ³Ό s λͺ…λ Ήμ–΄λ₯Ό μ μ ˆν•˜κ²Œ μ‚¬μš©ν•˜μ—¬ qweqweν•¨μˆ˜κΉŒμ§€ λ“€μ–΄κ°€λ³΄μž!
notion image
qweqweν•¨μˆ˜μ— μžˆλŠ” getsν•¨μˆ˜κΉŒμ§€ μ‹€ν–‰ν–ˆλ‹€λ©΄ 총 3번의 μž…λ ₯을 λ„£μ—ˆλ‹€.
이제 λ©”λͺ¨λ¦¬μ— μ–΄λ–»κ²Œ 데이터가 μ €μž₯λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•΄λ³΄μž.
notion image
ν˜„μž¬ qweqweν•¨μˆ˜λ₯Ό μˆ˜ν–‰ 쀑인 μƒνƒœμ΄λ‹€.
RSP λ ˆμ§€μŠ€ν„° μ£Όμ†Œμ˜ λ©”λͺ¨λ¦¬μ— λ‚¨μ•„μžˆλŠ” 값을 보면 0x63(c)λ₯Ό 12번 μž…λ ₯ν•œ 값이 μ €μž₯λ˜μ–΄ μžˆλ‹€.
12번 μž…λ ₯ν–ˆμœΌλ―€λ‘œ λ§ˆμ§€λ§‰ 4λ°”μ΄νŠΈλŠ” 0x00000000으둜 λ˜μ–΄μžˆλ‹€. (16λ°”μ΄νŠΈ 곡간을 ν™•λ³΄ν–ˆκΈ° λ•Œλ¬Έμ΄λ‹€.)
λ‹€μŒμœΌλ‘œ 0x7fffffffddd0은 λ°˜ν™˜ν•  μ˜ˆμ •μΈ 이전 ν•¨μˆ˜ μŠ€νƒμ˜ μ‹œμž‘μ  SFP(Stack Frame Pointer) μ£Όμ†ŒμΈ 것이닀.
λ§ˆμ§€λ§‰μœΌλ‘œ 0x4011d5λŠ” qweν•¨μˆ˜λ₯Ό μ΄μ–΄μ„œ μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ return μ£Όμ†Œμ΄λ‹€.
notion image
0x7fffffffddd0의 λ©”λͺ¨λ¦¬λ₯Ό ν™•μΈν•΄λ³΄λ‹ˆ 0x7fffffffddf0을 가리킀고 μžˆλ‹€.
ν•΄λ‹Ή μ£Όμ†Œμ—μ„œ buf의 크기(16)만큼 λ§ˆμ΄λ„ˆμŠ€ν•œ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 확인해보면 0x62(b)λ₯Ό μž…λ ₯ν•œ 값이 μ €μž₯λ˜μ–΄ μžˆλ‹€.
notion image
return μ£Όμ†ŒμΈ 0x4011d5λ₯Ό ν™•μΈν•΄λ³΄λ‹ˆ qwe+51을 가리킀고 μžˆλ‹€.
notion image
qwe+51은 call qweqweλ₯Ό μˆ˜ν–‰ν•œ ν›„ λ‹€μŒμœΌλ‘œ μ‹€ν–‰ν•΄μ•Ό ν•˜λŠ” μ£Όμ†Œμ΄λ‹€.
notion image
0x7fffffffddf0 λ©”λͺ¨λ¦¬λ₯Ό λ³΄λ‹ˆ 0x1이 μžˆλ‹€. 더 이상 μ—°κ²°λœ μŠ€νƒ ν”„λ ˆμž„μ΄ μ‘΄μž¬ν•˜μ§€ μ•Šλ‹€.
notion image
return μ£Όμ†ŒμΈ 0x401221λ₯Ό ν™•μΈν•΄λ³΄λ‹ˆ main+73을 가리킀고 μžˆλ‹€.
notion image
main+73은 call qweλ₯Ό μˆ˜ν–‰ν•œ ν›„ λ‹€μŒμœΌλ‘œ μ‹€ν–‰ν•΄μ•Ό ν•˜λŠ” μ£Όμ†Œμ΄λ‹€.

정리

SFP μ£Όμ†Œκ°€ 0x7fffffddb0(qweqwe) -> 0x7fffffffddd0 (qwe) -> 0x7fffffffddf0 (main)처럼 μ„œλ‘œ μ—°κ²°λ˜μ–΄ μžˆμŒμ„ 확인할 수 μžˆμ—ˆλ‹€.
push rbpλ₯Ό 톡해 이전 ν•¨μˆ˜ μŠ€νƒμ˜ μ‹œμž‘μ μ„ λ©”λͺ¨λ¦¬μ— λ³΄κ΄€ν•˜κ³ , μƒˆλ‘­κ²Œ μ‚¬μš©ν•  μŠ€νƒμ˜ μ£Όμ†Œλ₯Ό μ„€μ •(mov rbp, rsp)ν•˜κ³  λ‚˜μ„œ ν•¨μˆ˜κ°€ μ‹€ν–‰λœλ‹€.
ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό λ§ˆλ¬΄λ¦¬ν•˜κ³  λΉ μ Έλ‚˜μ˜¬ λ•Œ λ©”λͺ¨λ¦¬μ— λ³΄κ΄€ν–ˆλ˜ μ£Όμ†Œλ‘œ μŠ€νƒμ˜ μ‹œμž‘μ μ„ λ³΅κ΅¬ν•œλ‹€.
κ·Έλ‹€μŒ μ΄μ–΄μ„œ μˆ˜ν–‰ν•  λͺ…령어인 RET μ£Όμ†Œλ₯Ό μ‹€ν–‰ν•œλ‹€.

Β© hyuunnn 2024