Hack The Planet

λ°˜κ°‘μŠ΅λ‹ˆλ‹€, cyalume의 λΈ”λ‘œκ·Έμž…λ‹ˆλ‹€.

reverse engineering/CodeEngn

[CodeEngn] Basic RCE L04 λ¬Έμ œν’€μ΄

cyalume 2020. 12. 5. 00:50

λ¬Έμ œλŠ” μ—¬κΈ°μ„œ λ‹€μš΄λ°›μ„ 수 μžˆμŠ΅λ‹ˆλ‹€. (μ••μΆ• ν•΄μ œ μ‹œ λΉ„λ°€λ²ˆν˜Έ : codeengn)

 

λͺ©ν‘œκ°’ : 디버거λ₯Ό νƒμ§€ν•˜λŠ” ν•¨μˆ˜ 이름

 

ν•œ 번 싀행을 μ‹œμΌœλ³΄κ² μŠ΅λ‹ˆλ‹€.

"정상"μ΄λΌλŠ” λ¬Έμžμ—΄μ΄ κ³„μ†ν•΄μ„œ 좜λ ₯λ©λ‹ˆλ‹€.

λ¬Έμ œκ°€ 디버거 탐지 ν•¨μˆ˜μ— κ΄€ν•œ κ²ƒμ΄λ‹ˆ, μ•„λ§ˆ 이 μ •μƒμ΄λΌλŠ” λ¬Έμžμ—΄μ€ 디버거가 νƒμ§€λ˜μ§€ μ•Šμ•˜λ‹€λŠ” 뜻일 λ“― ν•©λ‹ˆλ‹€.

 

 

 

 

κ·Έλ ‡λ‹€λ©΄ λ””λ²„κ±°λ‘œ μ—΄μ–΄μ„œ ν•œ 번 싀행해보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

 

 

 

[Ctrl + F8] ν‚€λ₯Ό 눌러 Animate over κΈ°λŠ₯을 μ‚¬μš©ν•΄λ΄…μ‹œλ‹€.

 

 

 

 

λ‚΄λ €κ°€λ‹€ ν•œ 지점 (00408454 μ£Όμ†Œ) μ—μ„œ 멈좘 λ’€ "디버깅 당함" μ΄λΌλŠ” λ¬Έμžμ—΄μ΄ μ—°μ†ν•΄μ„œ 좜λ ₯λ©λ‹ˆλ‹€.

Animate over κΈ°λŠ₯을 μ‚¬μš©ν–ˆμœΌλ‹ˆ λ©ˆμΆ°μžˆλŠ” κ²ƒμ²˜λŸΌ 보여도 ν˜ΈμΆœν•œ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 싀행이 λ˜λŠ” 것 μž…λ‹ˆλ‹€.

이λ₯Ό λ°”νƒ•μœΌλ‘œ CALL λͺ…령이 ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜ 내뢀에 디버거λ₯Ό νƒμ§€ν•˜λŠ” 뢀뢄이 μžˆλ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.

 

[F7] ν‚€λ‘œ CALL λͺ…령이 ν˜ΈμΆœν•˜λŠ” μ˜μ—­ μ•ˆμœΌλ‘œ λ“€μ–΄κ°‘λ‹ˆλ‹€.

 

 

 

 

μ΄λ ‡κ²Œ IsDebuggerPresent λΌλŠ” ν•¨μˆ˜κ°€ λˆˆμ— λ„λ„€μš”.

이 λΆ€λΆ„μ—μ„œ "디버깅 당함" ν˜Ήμ€ "정상" λ¬Έμžμ—΄ 좜λ ₯으둜 κ²°κ³Όκ°€ λ‚˜λ‰  λ“― ν•©λ‹ˆλ‹€.

[Ctrl + F8] 둜 Animate over κΈ°λŠ₯을 μ‚¬μš©ν•˜μ—¬ 눈으둜 확인해 λ΄…μ‹œλ‹€.

 

 

 

 

μ΄λ ‡κ²Œ ν•œ ꡬ간을 κ³„μ†ν•΄μ„œ λŒλ©΄μ„œ "디버깅 당함" μ΄λΌλŠ” λ¬Έμžμ—΄μ„ 좜λ ₯ν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ ν”„λ‘œκ·Έλž¨μ˜ λ‚΄λΆ€ ꡬ쑰λ₯Ό 이해할 수 μžˆμŠ΅λ‹ˆλ‹€.

탐지 ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ 디버거가 μ‹€ν–‰λ˜κ³  μžˆλŠ”μ§€λ₯Ό ν™•μΈν•œ ν›„, κ·Έ λ°˜ν™˜κ°’μ— 따라 λ¬Έμžμ—΄μ˜ 좜λ ₯ κ²°κ³Όκ°€ "디버깅 당함" κ³Ό "정상" 으둜 λΆ„κΈ°ν•˜λŠ” κ²λ‹ˆλ‹€. 이 과정을 계속 λ°˜λ³΅ν•˜λ©΄μ„œμš”.

κ·Έλ ‡λ‹€λ©΄ 이 μ˜μ—­ 내뢀에 디버거 탐지 ν•¨μˆ˜κ°€ μžˆλ‹€λŠ” 것이 ν™•μ‹€ν•΄μ‘ŒμŠ΅λ‹ˆλ‹€. 

 

이제 디버거 탐지 ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ— 따라 좜λ ₯ κ²°κ³Όκ°€ λ‹¬λΌμ§„λ‹€λŠ” 것을 μ΄μš©ν•  κ²λ‹ˆλ‹€.

일단 맨 μœ„μ—μ„œ ν˜ΈμΆœλ˜λŠ” Sleep ν•¨μˆ˜λŠ” 좜λ ₯ μ‹œκ°„μ„ μ§€μ—°ν•΄μ£ΌλŠ” 역할인 λ“― ν•˜λ‹ˆ λ„˜μ–΄κ°‘λ‹ˆλ‹€.

IsDebuggerPresent ν•¨μˆ˜μ— BP λ₯Ό κ±Έκ³  λ°˜ν™˜κ°’κ³Ό 좜λ ₯ 결과의 관계λ₯Ό 보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

 

 

 

[F9] ν‚€λ‘œ BP μ „κΉŒμ§€ 싀행을 ν•΄μ€€ λ’€ [F8] ν‚€λ‘œ IsDebuggerPresent ν•¨μˆ˜λ₯Ό step over ν•˜κ² μŠ΅λ‹ˆλ‹€.

λ ˆμ§€μŠ€ν„° 창을 보면 ν•¨μˆ˜μ˜ 리턴값을 μ €μž₯ν•˜λŠ” λ ˆμ§€μŠ€ν„°, EAX κ°€ 1이 된 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

μ΄λ ‡κ²Œ λ°˜ν™˜κ°’μ΄ 1이 되고, 디버깅 λ‹Ήν•¨μ΄λΌλŠ” κΈ€μžκ°€ 좜λ ₯λ©λ‹ˆλ‹€.

 

 

 

 

이 ν•¨μˆ˜κ°€ 디버거 탐지 ν•¨μˆ˜μΈμ§€ ν™•μ‹€νžˆ μ•Œμ•„λ‚΄κΈ° μœ„ν•΄ 좜λ ₯ μ „ 리턴값을 λ°”κΏ” ν™•μΈν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

λ‹€μ‹œ IsDebuggerPresent ν•¨μˆ˜κΉŒμ§€ μ‹€ν–‰ν•œ ν›„, 1이 된 리턴값을 0으둜 μˆ˜μ •ν•΄μ€λ‹ˆλ‹€.

 

 

 

 

 

OK λ₯Ό λˆ„λ₯΄κ³  λ‹€μ‹œ μ‹€ν–‰ν•΄λ΄…μ‹œλ‹€.

 

 

 

 

디버거λ₯Ό 싀행쀑인데도 μ •μƒμ΄λΌλŠ” 메세지가 λœΉλ‹ˆλ‹€.

IsDebuggerPresent ν•¨μˆ˜μ˜ λ°˜ν™˜ 값을 μˆ˜μ •ν•˜μ˜€λ”λ‹ˆ κ²°κ³Όκ°€ λ‹¬λΌμ§€λ„€μš”.

λ”°λΌμ„œ IsDebuggerPresent ν•¨μˆ˜λŠ” 디버거 탐지 ν•¨μˆ˜ μž…λ‹ˆλ‹€.

 

디버거 탐지 ν•¨μˆ˜μ˜ 이름 : IsDebuggerPresent

 

(IsDebuggerPresent : ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€κ°€ λ””λ²„κ±°μ—μ„œ 싀행이 되면 λ°˜ν™˜κ°’μ΄ 0이 μ•„λ‹ˆκ³ , ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€κ°€ λ‹€λ²„κ±°μ—μ„œ μ‹€ν–‰λ˜μ§€ μ•ŠμœΌλ©΄ λ°˜ν™˜κ°’μ΄ 0이닀. -MSDN)