Hack The Planet

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

reverse engineering/CodeEngn

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

cyalume 2020. 12. 6. 21:46

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

 

λͺ©ν‘œκ°’ : OEP(Original Entry Point) + Serial κ°’

 

OEP λž€?

더보기

ν”„λ‘œκ·Έλž¨μ˜ μ§„μ§œ μ‹œμž‘ μœ„μΉ˜, νŒ¨ν‚Ήλ˜μ–΄ μžˆλŠ” νŒŒμΌμ„ μ •μƒμ μœΌλ‘œ μ–ΈνŒ¨ν‚Ή ν–ˆμ„ λ•Œμ˜ λ³Έ μ‹œμž‘ μœ„μΉ˜.

UPX 의 κ²½μš°μ—λŠ” POPAD λͺ…λ Ή λ’€ JMP 문을 μ‚¬μš©ν•΄ μ••μΆ•ν•΄μ œλœ 원본 μ½”λ“œμ˜ μœ„μΉ˜λ‘œ μ ν”„ν•˜λŠ”λ°, κ·Έ 점프문이 μ‹€ν–‰λ˜μ–΄ μ΄λ™ν•œ μ£Όμ†Œκ°€ OEP μž…λ‹ˆλ‹€.

 

싀행을 μ‹œμΌœλ΄…λ‹ˆλ‹€.

 

 

 

 

μ‚¬μš©μžκ°€ μž…λ ₯ν•œ κ°’κ³Ό μ‹œλ¦¬μ–Όμ„ λΉ„κ΅ν•˜λŠ” μœ ν˜•μ˜ λ¬Έμ œμž…λ‹ˆλ‹€.

 

 

 

 

μž…λ ₯κ°’κ³Ό μ‹œλ¦¬μ–Όμ΄ μΌμΉ˜ν•˜μ§€ μ•Šμ„ μ‹œ μ‹€νŒ¨ λ©”μ„Έμ§€λ°•μŠ€κ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€.

 

 

 

 

λ””λ²„κ±°λ‘œ 열어보면 PUSHAD λΌλŠ” λͺ…령이 κ°€μž₯ λ¨Όμ € λˆˆμ— λ•λ‹ˆλ‹€.

UPX 둜 νŒ¨ν‚Ήλ˜μ–΄ μžˆλŠ” νŒŒμΌμ΄λ„€μš”.

 

 

 

 

μ΄λ ‡κ²Œ PEid 둜 νŒ¨ν‚Ήλœ λͺ¨μŠ΅μ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

 

μ „ λ‹¨κ³„μ—μ„œλ„ μ–ΈνŒ¨ν‚Ήμ— λŒ€ν•΄ μ„€λͺ…ν–ˆμœΌλ‹ˆ κ°„λ‹¨νžˆ μ§„ν–‰ν•˜λ„λ‘ ν•©μ‹œλ‹€.

POPAD λͺ…λ Ή λ’€ μ••μΆ•ν•΄μ œλœ 원본 μ½”λ“œλ‘œ μ ν”„ν•˜λŠ” λͺ…령에 BP λ₯Ό κ±Έκ³  싀행을 ν•΄ μ€λ‹ˆλ‹€.

[F8] ν‚€λ‘œ μ΄λ™ν•˜λ©΄ μ•„λž˜μ™€ 같이 μ–ΈνŒ¨ν‚Ήλœ μ½”λ“œλ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

00401360 μ£Όμ†Œλ‘œ μ΄λ™ν–ˆμœΌλ‹ˆ, OEP λŠ” 00401360 μž…λ‹ˆλ‹€.

 

 

 

 

이제 덀프λ₯Ό λ–  μ€˜μ•Όκ² μ£ ?

(마우슀 우클릭 -> Dump debugged process)

Rebuild μ˜΅μ…˜μ— 체크λ₯Ό ν•΄μ œν•˜μ§€ μ•Šκ³  μ§„ν–‰ν•©λ‹ˆλ‹€.

κ·ΈλŒ€λ‘œ Dump λ²„νŠΌμ„ 눌러 06_dump 둜 μ €μž₯ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

 

 

 

덀프λ₯Ό 뜬 νŒŒμΌμ„ 싀행해보면 잘 λŒμ•„κ°€λŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

νŒ¨ν‚Ήμ΄ ν’€λ ΈλŠ”μ§€ PEid 둜 확인을 ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

 

 

 

μ΄λ ‡κ²Œ μ •μƒμ μœΌλ‘œ 압좕이 ν•΄μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

이 μƒνƒœλ‘œ 디버거에 μ˜¬λ €λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

 

 

 

원본 μ½”λ“œκ°€ λ³΄μž…λ‹ˆλ‹€.

μ›λž˜λŠ” All referenced text strings κΈ°λŠ₯을 μ΄μš©ν•˜λ € ν–ˆμœΌλ‚˜, μ•„λž˜μ™€ 같이 μ•„λ¬΄λŸ° λ¬Έμžμ—΄λ„ 보이지 μ•ŠμŠ΅λ‹ˆλ‹€.

 

 

 

 

κ·Έ κ΄€κ³„λ‘œ All intermodular calls κΈ°λŠ₯을 μ‚¬μš©ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

All intermodular calls λŒ€μ‹  Back to user mode λ₯Ό μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

 

Back to user mode?

더보기

Back to user mode λž€ νŠΉμ • μ΄λ²€νŠΈκ°€ μΌμ–΄λ‚˜κΈ° 전에 μ„€μ •ν•˜λ©°, νŠΉμ • 이벀트의 call λͺ…령이 μΌμ–΄λ‚œ λ‹€μŒ κ·Έ μ£Όμ†Œλ₯Ό μž‘μ„ 수 μžˆλŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.

μ–΄λ–»κ²Œ ν•˜λŠ”κ°€?

 

λ””λ²„κ±°μ—μ„œ νŒŒμΌμ„ μ‹€ν–‰ν•΄ μ€λ‹ˆλ‹€. 

아무 κ°’μ΄λ‚˜ μž…λ ₯ν•œ λ’€ 였λ₯˜ λ¬Έμžμ—΄μ„ λ„μš°κ³ , 였λ₯˜ λ©”μ„Έμ§€λ°•μŠ€μ˜ 확인 λ²„νŠΌμ„ λˆ„λ₯΄μ§€ μ•Šμ€ μ±„λ‘œ ν”„λ‘œκ·Έλž¨μ„ μ •μ§€μ‹œμΌœ μ€λ‹ˆλ‹€. (쒌츑 μƒλ‹¨λ°”μ˜ 정지 λ²„νŠΌ ν˜Ήμ€ [F12] ν‚€λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.) 

μ—¬κΈ°μ„œ [Alt + F9] ν‚€λ₯Ό λˆ„λ₯΄λ©΄ Back to user mode 둜 λ“€μ–΄κ°ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ μ—λŸ¬ λ©”μ„Έμ§€λ°•μŠ€μ˜ 확인 λ²„νŠΌμ„ λˆ„λ₯΄λ©΄ κ·Έ μ£Όμ†Œλ‘œ 이동할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ €λŠ” PEid 둜 μ–ΈνŒ©λœ νŒŒμΌμ„ 열어봀을 λ•Œ, Visual C++ 을 μ‚¬μš©ν•œ κ²ƒμœΌλ‘œ 보아 μ—λŸ¬ 창을 ν˜ΈμΆœν•  λ•Œ Win32 API 의 MessageBox ν•¨μˆ˜λ₯Ό μ‚¬μš©ν–ˆμœΌλ¦¬λΌ μΆ”μΈ‘ν–ˆμŠ΅λ‹ˆλ‹€. 

우클릭 -> Search for -> All intermodular calls κΈ°λŠ₯으둜 MessageBox ν•¨μˆ˜λ₯Ό μ°Ύμ•„λ΄…μ‹œλ‹€.

 

 

 

 

어렡지 μ•Šκ²Œ 찾을 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

λ”λΈ”ν΄λ¦­μœΌλ‘œ μœ„ μ£Όμ†Œλ‘œ μ΄λ™ν•΄μ€μ‹œλ‹€.

 

 

 

 

μ΄λ ‡κ²Œ λ©”μ„Έμ§€λ°•μŠ€ 호좜 μ „ν›„λ‘œ 성곡/μ‹€νŒ¨μ‹œ 좜λ ₯λ˜λŠ” λ¬Έμžμ—΄μ΄ λ³΄μž…λ‹ˆλ‹€.

쑰건 뢄기문은 성곡 λ¬Έμžμ—΄ μœ„μ— μžˆμ„ κ²λ‹ˆλ‹€.

 

 

 

 

이 JNZ λͺ…령이 μ‹€ν–‰λ˜λ©΄ μ‹€νŒ¨ λ¬Έμžμ—΄ 좜λ ₯ λ°”λ‘œ μœ„ μ£Όμ†Œλ‘œ μ΄λ™ν•˜λ„€μš”.

μœ„ TEST λͺ…λ ΉμœΌλ‘œ EAX κ°€ 0이 μ•„λ‹ˆλ©΄ JNZ λͺ…λ Ήμ˜ μ‹€ν–‰μœΌλ‘œ μ‹€νŒ¨ν•˜κ²Œ λ©λ‹ˆλ‹€.

EAX 라면 리턴 값을 μ €μž₯ν•˜λŠ” λ²”μš© λ ˆμ§€μŠ€ν„°μ˜€μ£ ?

κ·Έλ ‡λ‹€λ©΄ λ°”λ‘œ μœ„μ—μ„œ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜μ— μ£Όλͺ©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

 

 

 

μ΄λ ‡κ²Œ TEST λͺ…λ Ήμ˜ μœ„, ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 뢀뢄에 BP λ₯Ό κ±Έμ–΄μ€λ‹ˆλ‹€.

이 ν•¨μˆ˜λŠ” PUSH λͺ…령을 톡해 두 개의 인자λ₯Ό μ „λ‹¬λ°›λŠ”λ°, ν•˜λ‚˜λŠ” 아직 λͺ¨λ₯΄κ³  λ‹€λ₯Έ ν•˜λ‚˜λŠ” "AD46DFS547" μ΄λΌλŠ” λ¬Έμžμ—΄μž…λ‹ˆλ‹€.

BP κΉŒμ§€ μ‹€ν–‰ν•΄λ΄…μ‹œλ‹€.

 

 

 

 

μ•„κΉŒ μ‹€νŒ¨ν–ˆλ˜ λ¬Έμžμ—΄μ„ λ„£μ–΄μ€λ‹ˆλ‹€.

 

 

 

 

주석 창에 μ‚¬μš©μžκ°€ μž…λ ₯ν•œ μ‹œλ¦¬μ–Ό 값이 μΆ”κ°€κ°€ λ©λ‹ˆλ‹€.

PUSH λͺ…λ ΉμœΌλ‘œ 이 ν•¨μˆ˜μ— μ „λ‹¬λ˜λŠ” 인자 ν•˜λ‚˜λŠ” μ œκ°€ μž…λ ₯ν•œ κ°’μ΄μ˜€λ„€μš”.

(00401073 μ£Όμ†Œμ„œ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜μ˜ 인자 : μ‚¬μš©μžκ°€ μž…λ ₯ν•œ μ‹œλ¦¬μ–Ό,  AD46DFS547 μ΄λΌλŠ” λ¬Έμžμ—΄)

κ·Έλ ‡λ‹€λ©΄ 이 ν•¨μˆ˜λŠ” λ¬Έμžμ—΄ 비ꡐ ν•¨μˆ˜μΌ κ²λ‹ˆλ‹€.

 

 

 

μ΄λ ‡κ²Œ ν•¨μˆ˜ λ‚΄λΆ€λ‘œ step in 해보면 EDX 에 AD46DFS547 μ΄λΌλŠ” 값을, ECX 에 μš°λ¦¬κ°€ μž…λ ₯ν•œ 값을 λ„£μŠ΅λ‹ˆλ‹€.

EDX의 4 byte λ₯Ό EAX에 λ„£μ–΄ ECX와 1 byte μ”© λΉ„κ΅ν•˜κ³ , ZF = 0 이면 1을 λ¦¬ν„΄ν•˜κ³  ZF = 1이면 λΉ„κ΅ν•˜λŠ” 과정을 계속 λ°˜λ³΅ν•©λ‹ˆλ‹€.

 

κ°„λ‹¨νžˆ 말해 μš°λ¦¬κ°€ μž…λ ₯ν•œ κ°’κ³Ό AD46DFS547 을 λΉ„κ΅ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€.

이 AD46DFS547 μ΄λΌλŠ” 값을 ν”„λ‘œκ·Έλž¨μ˜ μ‹œλ¦¬μ–Ό κ°’μœΌλ‘œ λ„£μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

 

 

 

Check Serial λ²„νŠΌμ„ λˆ„λ¦…λ‹ˆλ‹€.

 

 

 

 

 

μ΄λ ‡κ²Œ 성곡 λ©”μ„Έμ§€λ°•μŠ€κ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€.

λ”°λΌμ„œ μ‹œλ¦¬μ–Ό 값은 AD46DFS547 μž…λ‹ˆλ‹€.

 

μš°λ¦¬κ°€ ꡬ해야 ν•˜λŠ” 값은 OEP + Serial κ°’μ΄λ‹ˆ 닡은 00401360AD46DFS547 μž…λ‹ˆλ‹€.

 

OEP + Serial = 00401360AD46DFS547