SECURITY/REVERSING

리버싱 예제 :: gdb -01 file, x-executable, gdb binary file

\b\t 2020. 7. 21. 23:12

이번 μ‹€μŠ΅μ˜ λͺ©μ μ€ 예제 파일이 μ–΄λ–€ ν”„λ‘œκ·Έλž¨μΈμ§€λ₯Ό μ•Œμ•„λ‚΄κ³ , 

무엇을 μž…λ ₯ν•΄μ•Όμ§€ "oh great!!" λΌλŠ” λ¬Έμž₯이 좜λ ₯될 μ§€ μ•Œμ•„λ³΄λŠ” 것이닀.

 

 

μœˆλ„μš°μ—μ„œλŠ” 파일 ν™•μž₯자둜 파일 정보λ₯Ό νŒŒμ•…ν•  수 μžˆλŠ”λ°,

λ¦¬λˆ…μŠ€μ—μ„œλŠ” ν™•μž₯μžκ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ•„μ„œ μž„μ˜μ˜ 파일의 μ’…λ₯˜λ₯Ό μ•ŒκΈ° μœ„ν•΄μ„œλŠ” λ³„κ°œμ˜ μž‘μ—…μ΄ ν•„μš”ν•˜λ‹€.

 

 

λ¨Όμ €, readelf λͺ…λ Ήμ–΄λ‘œ 헀더 등을 μ‚΄νŽ΄λ³΄λ©΄ λ‹€μŒκ³Ό κ°™λ‹€. 

 

 

 

 

file λͺ…λ Ήμ–΄λ‘œ 파일의 μ’…λ₯˜λ₯Ό 확인할 수 μžˆλ‹€.

 

file filename : filename 의 정보λ₯Ό 좜λ ₯

 

-i μ˜΅μ…˜μ„ μ£Όλ©΄ MIME λ―Έλ””μ–΄ νƒ€μž… λ¬Έμžμ—΄λ‘œ ν‘œμ‹œλœλ‹€. 

더 κ°„λ‹¨ν•˜κ³  ν•΅μ‹¬λ§Œ.. 파일 μ’…λ₯˜λ₯Ό λ°”λ‘œ 확인할 수 μžˆλ‹€. 

 

 

예제 νŒŒμΌμ€ binary file 이고 x-executable νŒŒμΌμž„μ„ μ•Œ 수 μžˆλ‹€.

 

binary file 이라 κ·Έλƒ₯ text editor λ‘œλŠ” 이해할 수 μ—†λŠ” 정보듀이 λ‚˜μ˜¬ 것이닀.

hexdump ν˜Ήμ€ objdump 둜 16μ§„μˆ˜ ν˜Ήμ€ μ–΄μ…ˆλΈ”λ¦¬μ–΄λ‘œ λ²ˆμ—­λœ μ½”λ“œλ₯Ό λ³Ό 수 μžˆλ‹€.

 

 

μΆ”κ°€λ‘œ, c μ½”λ“œ, μ–΄μ…ˆλΈ”λ¦¬μ–΄, κ·Έλƒ₯ λΉ„μ–΄μžˆλŠ” 파일의 μ •λ³΄λŠ” λ‹€μŒκ³Ό 같이 좜λ ₯λœλ‹€.

 

 

 

 

x-executable νŒŒμΌμ€ λ‹€μŒμ˜ λͺ…λ Ήμ–΄λ‘œ μ‹€ν–‰μ‹œν‚¬ 수 μžˆλ‹€.

 

(λ¨Όμ € ν•΄λ‹Ή 파일의 νΌλ―Έμ…˜μ΄ 777이어야 ν•œλ‹€.)

sudo chmod 777 filename : filename 의 νΌλ―Έμ…˜μ„ 777둜 λ³€κ²½

  (ν˜Ήμ€ κ·Έλƒ₯ x 만 λ”ν•΄μ€˜λ„ λœλ‹€. chmod +x filename )

./filename : filename μ‹€ν–‰

   ( -> 이게 μ•ˆλ  λ•Œ : sh filename ν˜Ήμ€ head -5 filename )

 

 

 

 

objdump : 화면에 object file 의 정보λ₯Ό 좜λ ₯ν•΄μ£ΌλŠ” ν”„λ‘œκ·Έλž¨

 

-0x26(%ebp)

 

쟀λ₯Ό λ§žμΆ°μ•Ό ν•˜λŠ” κ²ƒμž„μ„ μœ μΆ”ν•˜μ˜€λ‹€.

 

 

 

(gdb) info μ—μ„œ μ—¬λŸ¬ 정보λ₯Ό 얻을 수 μžˆλ‹€. 

ν•˜μ§€λ§Œ λ‚˜λŠ” μ—¬κΈ°μ„œλŠ” μœ μš©ν•œ 정보λ₯Ό μ–»μ§€λŠ” λͺ»ν–ˆλ‹€..

 

 

 

 

 

λ‹€μ‹œ λŒμ•„μ™€μ„œ,

disassemble funcName ν˜Ήμ€ disass funcName : funcName (ν•¨μˆ˜) 의 μ–΄μ…ˆλΈ”λ¦¬ μ½”λ“œ 좜λ ₯

 

 


break N ν˜Ήμ€ b N : N 번째 쀄에 break point 

 

그런데 이 μ½”λ“œλŠ” λ°”μ΄λ„ˆλ¦¬ μ½”λ“œλΌ κ·ΈλŸ°μ§€? break 1 만 해도 line 1 이 μ—†λ‹€κ³  λ‚˜μ˜¨λ‹€. μ™œμΈμ§€λŠ”..

κ·Έλ ‡λ‹€λ©΄ λ°”μ΄λ„ˆλ¦¬ μ½”λ“œλ₯Ό gdb μ—μ„œ λ””λ²„κΉ…ν•˜λŠ” 방법을 ......

 

 

κ·Έλž˜μ„œ μ–΄μ…ˆλΈ”λ¦¬ μ½”λ“œμ—μ„œμ˜ μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•˜μ—¬ break point λ₯Ό μž‘μ•˜λ‹€.

 

break *μ£Όμ†Œ : μ£Όμ†Œ 에 break point

 

 

쀑단점을 걸어두고 λ°”μ΄λ„ˆλ¦¬ μ½”λ“œλ₯Ό λ³΄λ‹ˆ scanf 둜 μ‚¬μš©μžμ—κ²Œ μž…λ ₯을 λ°›κ³  λ‚˜μ„œ, strcmp λ₯Ό ν•˜κΈ° μ „ 비ꡐ λŒ€μƒμ„ push ν•˜λŠ” 것을 λ°œκ²¬ν•˜μ˜€λ‹€.

 

 

μ € μ£Όμ†Œμ— μžˆλŠ” 값이 무엇인지λ₯Ό μ•Œλ©΄ 닡을 ꡬ할 수 μžˆλ‹€ !! << 0x80485ae

 

 

이제 μ–΄λ–»κ²Œ λ©”λͺ¨λ¦¬ μ£Όμ†Œμ˜ 값을 쑰사할지λ₯Ό 보면, 

x adress : adress 의 정보 좜λ ₯

( ν˜Ήμ€ x $register : register κ°€ κ°€μ§€κ³  μžˆλŠ” μ£Όμ†Œ 정보 (?) )

 

 

 

μ—¬κΈ°μ„œ ν•„μš”μ— 따라 μœ μš©ν•œ μ˜΅μ…˜λ“€μ„ 쀄 수 μžˆλ‹€.

 

x/format adress : adress λ₯Ό format ν˜•μ‹μœΌλ‘œ 좜λ ₯

 

x Hexadecimal format
o Octal format
u Unsigned decimal format
t Binary format
d Decimal format
s string
i CPU instruction
Nx examine N words form stack

 

string λͺ…λ Ήμ–΄λ‘œ μ € μ£Όμ†Œ (0x80485ae) 에 μžˆλŠ” 값을 μ‚΄νŽ΄λ³΄κΈ°λ‘œ ν•œλ‹€.

 

κ²°κ³ΌλŠ”..

 

 

yes!! λ₯Ό μž…λ ₯ν•΄μ•Όμ§€ oh great!! κ°€ 좜λ ₯됨을 μ•Œμ•„λ‚΄μ—ˆλ‹€ !!

 

 

λ‹€λ₯Έ μ˜΅μ…˜λ“€λ„ ν•œ 번 해보면 λ‹€μŒκ³Ό κ°™λ‹€.

 

(0x79 λŠ” y , 0x65 λŠ” e)

 

 

또, eax 에 μ €μž₯된, λ‚΄κ°€ μž…λ ₯ν•œ λ¬Έμžμ—΄μ„ ν•œ 번 보면 λ‹€μŒκ³Ό κ°™λ‹€. 

 

 

 

breakpoint 둜 멈좘 것이라

gdb λͺ…λ Ήμ–΄λ‘œ step (λ‹€μŒμœΌλ‘œ λ„˜μ–΄κ°) ν•˜κ³  continue λ₯Ό ν•˜λ‹ˆ μ—­μ‹œλ‚˜ "oh no... :(" κ°€ 좜λ ₯됨을 ν™•μΈν•˜μ˜€λ‹€.

 

 

 

breakpoint μ•„λ‹ˆμ–΄λ„ 0x80485ae 에 μ €μž₯된 값은 μ•Œ 수 μžˆμ§€λ§Œ, (λ©”λͺ¨λ¦¬μ— μ €μž₯λ˜μ–΄ μžˆμœΌλ‹ˆ ~)

eax 에 μ €μž₯λ˜μ—ˆλ˜ 정보듀은 확인할 수 μ—†λ‹€λŠ” 것을 ν•œ 번 확인해 λ³΄μ•˜λ‹€.

 

만일 λ‚΄κ°€ μ•Œμ•„μ•Ό ν•˜λŠ” 정보가 ν”„λ‘œκ·Έλž¨μ΄ λŒμ•„κ°€λŠ” λ™μ•ˆ λ°”λ€Œκ³  μ—†μ–΄μ§€λŠ” 정보라면 break point λ₯Ό 잘 μž‘μ•„μ•Ό ν•œλ‹€!

 

 

break point λ₯Ό μ‚­μ œν•˜λ €λ©΄ break point 번호λ₯Ό μž…λ ₯ν•˜λ©΄ λœλ‹€.

(μ–΄λ–€ 라인의 break point μ‚­μ œ λ“± λ‹€λ₯Έ 방법도 λ§Žλ‹€.)

 

info b(reak) : break point 리슀트 좜λ ₯

d N : N 번째 break point μ‚­μ œ

d : λͺ¨λ“  break point μ‚­μ œ

 

 

break point λŠ” μ‚­μ œλ˜μ–΄λ„ λ„˜λ²„λ§μ€ μ§€μ†λœλ‹€.

 

 

1번 break point κ°€ μ‚­μ œλ˜μ—ˆμ§€λ§Œ λ‹€μŒμ˜ break point λŠ” 2λ²ˆμž„μ„ μ•Œ 수 μžˆλ‹€.

 

 

 

 

이제 λͺ¨λ“  break point λ₯Ό μ‚­μ œν•˜κ³ , 찾은 λ‹΅μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ„ 돌렀 보겠닀.

 

 

성곡!

 

 

 

μ°Έκ³ )

(λ””λ²„κΉ…μ—μ„œ) i r  : λ ˆμ§€μŠ€ν„° 정보듀 좜λ ₯

 

 

 

+)

정말 μœ μš©ν•˜κ²Œ μ°Έκ³ ν•œ https://hacksland.net/debugging-binaries-with-gdb/

쒋은 정보듀이 λ§Žλ‹€.!