ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리버싱 예제 :: gdb -01 file, x-executable, gdb binary file
    SECURITY/REVERSING 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/

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

    λŒ“κΈ€

Designed by Tistory.