[리버싱 μ‹€μŠ΅] μ•…μ„±μ½”λ“œ μƒ˜ν”Œ 뢄석 (Malware Bytes ν›ˆλ ¨μš© μƒ˜ν”Œ μ‚¬μš©)

728x90
λ°˜μ‘ν˜•

 

μƒ˜ν”Œ 정보 : "Malware Bytes" λ°±μ‹ νšŒμ‚¬μ—μ„œ κ³΅κ°œν•œ μ•…μ„±μ½”λ“œ 뢄석 ν›ˆλ ¨μš© μƒ˜ν”Œ

 

확인할 정보

  • Anti-debugging, Anti-VM λ“± 뢄석 λ°©ν•΄ κΈ°λŠ₯
  • λ°μ΄ν„°μ˜ 인코딩/λ””μ½”λ”©
  • ν”„λ‘œμ„ΈμŠ€ ν• λ‘œμž‰ 기법

 

 

 

1. 동적 뢄석 - μƒ˜ν”Œ μ‹€ν–‰ κ²°κ³Ό 확인


 

μƒ˜ν”Œ μ‹€ν–‰ μ‹œ μœ„μ™€ 같은 μ‹€ν–‰ κ²°κ³Όκ°€ 보여진닀.

상세 λΆ„μ„œμ—μ„œλŠ” x64dbgλΌλŠ” 디버거λ₯Ό 톡해 뢄석을 μ§„ν–‰ν•œλ‹€.

 

 


 

2. λ¬Έμžμ—΄ 검색


μœ„μ—μ„œ 동적 뢄석에 ν™•μΈν–ˆλ˜ λ¬Έμžμ—΄ "I am so sorry, you failed! :("을 μ°Ύμ•„μ„œ (뢄석에 ν•„μš”ν•œ) μ‹œμž‘ μœ„μΉ˜λ₯Ό ν™•μΈν•œλ‹€.

 

[λ‹€μŒμ„ μ°ΎκΈ°] → [ν˜„μž¬ λͺ¨λ“ˆ] → [λ¬Έμžμ—΄ μ°Έμ‘°]

 

 

"I am so sorry, you failed! :(" 확인

 

[λ€ν”„ν•΄μ„œ 따라가기]둜 뢄석에 ν•„μš”ν•œ μœ„μΉ˜λ‘œ 이동

 

점프가 취해지기 μ „ (jne)을 쀑단점(F2)으둜 μ„€μ •

 

 


 

 

3. μ•ˆν‹° 디버깅


jne(jump not equal) μ „ call  ν•¨μˆ˜ (call 0x004085E9, call 0x004014F0)λ₯Ό ν™•μΈν•œλ‹€.

0X004014F0 ν•¨μˆ˜μ—μ„œ rdtsc λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‹€ν–‰λ˜λŠ” μ‹œκ°„μ„ μ €μž₯ν•˜λŠ” 것이 ν™•μΈλ˜μ—ˆλ‹€.

 

 

call 0x004014F0 ν•¨μˆ˜ 확인.

 

 

 

두 가지 체크할 사항이 ν™•μΈλœλ‹€.

rdtsc λͺ…λ Ήμ–΄ μ‚¬μš©μ„ 톡해 μ‹€ν–‰ μ‹œκ°„ 정보λ₯Ό eax와 edx에 μ €μž₯ν•˜μ—¬ 8개의 ν•¨μˆ˜λ₯Ό μ§€λ‚˜κ°„ 후에 call 0x401BC0μ—μ„œ λΉ„κ΅ν•œλ‹€.

 

 

function #1: call 0x4019D0 - 뢄석

 

call ν•¨μˆ˜ 3개 / je(jump equal = if λ¬Έ)

 

 

ⓐ IsDebuggerPresent() μ‚¬μš©

 

 

IsDebuggerPresent()λŠ” μ§€κΈˆ λ™μž‘ 쀑인 μ‹œμŠ€ν…œμ΄ 디버거 λͺ¨λ“œλ‘œ 싀행쀑인지 νŒλ‹¨ν•˜λŠ” API이닀.

 

이 APIλ₯Ό 톡해 디버깅 λͺ¨λ“œ μ—¬λΆ€λ₯Ό νŒλ‹¨ν•˜μ—¬ 디버깅 쀑이면 eax에 1을 μ €μž₯ν•œλ‹€. κ·Έ ν›„ test λͺ…λ Ήμ–΄λ‘œ eaxλ₯Ό κ²€μ‚¬ν•˜μ—¬ (디버깅 → ZF = 0) CMOVNE λͺ…λ Ήμ–΄λ‘œ ZFκ°€ 0이면 ESI에 1이 μ €μž₯λœλ‹€.

 

 

 

β“‘ CheckRemoteDebuggerPresent μ‚¬μš©

 

 

CheckRemoteDebuggerPresent()λŠ” λ°˜ν™˜ 값이 0이면 정상.

 

CheckRemoteDebuggerPresent() APIλ₯Ό 톡해 디버깅 λͺ¨λ“œ μ—¬λΆ€λ₯Ό νŒλ‹¨ν•˜μ—¬ 디버깅 쀑이면 eax와 [ebp-4]의 μœ„μΉ˜μ— 1이 μ €μž₯λœλ‹€. 비ꡐλ₯Ό 톡해 ν˜„μž¬ 디버깅 쀑이면 ESI 값이 1둜 증가 λœλ‹€. ESIκ°€ 2이면 ZFκ°€ 1둜 μ„€μ •λœλ‹€(ⓐ와 β“‘λ₯Ό 거쳐 2둜 λœλ‹€). sete λͺ…λ Ήμ–΄λ‘œ ZFκ°€ 1이면 eaxλ₯Ό 1둜 μ„€μ •ν•˜κ³ , μ•„λ‹ˆλ©΄ eaxκ°€ 0이 λœλ‹€

 

 

 

β“’ ν”Œλž˜κ·Έ κ°’ μ„€μ •

 

 

μ•žμ— 두 단계 ⓐ, β“‘λ₯Ό κ±°μ³μ„œ ν˜„μž¬ 디버깅 쀑인지 νŒλ‹¨ν•˜μ—¬, 디버깅 쀑이라면 β“’ 뢀뢄이 μ‹€ν–‰λœλ‹€.

 

이 뢀뢄은 ν›ˆλ ¨μš© μƒ˜ν”Œμ΄λΌμ„œ νŠΉμ • μ£Όμ†Œμ— ν”Œλž˜κ·Έ 값을 μ„€μ •ν•˜κ³  μžˆλ‹€. [429F74]에 μ•ˆν‹°λ””λ²„κΉ… 기법을 찾은 횟수λ₯Ό μ €μž₯ν•˜μ˜€λ‹€.

 

 

function #1: call 0x4019D0 - μ•ˆν‹° 디버깅 우회

 

9개의 ν•¨μˆ˜λ“€μ„ 뢄석 쀑에 κ³΅ν†΅λœ νŠΉμ§• ν•˜λ‚˜λ₯Ό λ°œκ²¬ν•˜μ˜€λ‹€. λͺ¨λ“  ν•¨μˆ˜μ—μ„œ je(ifλ¬Έ)을 κ±°μ³μ„œ [429F74]λ₯Ό ν˜ΈμΆœν•˜μ—¬ 무언가λ₯Ό μ €μž₯ν•œλ‹€.

 

 

이 je(ifλ¬Έ)μ—μ„œ 점프가 취해지지 μ•Šλ„λ‘ jeλ₯Ό μ–΄μ…ˆλΈ”μ„ 톡해 ‘nop’μƒνƒœλ‘œ 인코딩 ν•΄μ£Όμ—ˆλ‹€. λ‹€μŒ λ‚˜λ¨Έμ§€ 8개의 ν•¨μˆ˜λ“€μ—μ„œλ„ λ™μΌν•˜κ²Œ ‘nop’으둜 μΈμ½”λ”©ν•˜μ—¬ 점프가 취해지지 μ•Šκ³  μ°¨λ‘€λŒ€λ‘œ λ™μž‘λ˜κ²Œ ν•˜μ˜€λ‹€.

 

je 단이 ‘nop’ μΈμ½”λ”©λ˜μ–΄ λ³€κ²½λœ μƒνƒœ


 

function #2: call 0x401A50 - 뢄석

 

 

ⓐ RaiseException() μ‚¬μš©

 

 

RaiseException() ν•¨μˆ˜: λ§€κ°œλ³€μˆ˜ 0x40010006λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 디버깅 μ—¬λΆ€λ₯Ό νŒλ‹¨ν•˜μ—¬ 디버깅 쀑 일 경우 μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ—¬ ν˜„μž¬ μ‹œμŠ€ν…œμ΄ 디버깅 λͺ¨λ“œμΈμ§€ νŒŒμ•…ν•  수 μžˆλ‹€

 

 

β“‘ SHE ν•Έλ“€λŸ¬ μ„€μ •

 

 

SEH ν•Έλ“€λŸ¬λ₯Ό μ„€μ •ν•˜λ©΄ μ˜ˆμ™Έμ‚¬ν•­μ΄ λ°œμƒν•  λ•Œ SEH둜 흐름이 바뀐닀.

 

μ—¬κΈ°μ—μ„œλŠ” SEH ν•Έλ“€λŸ¬ μ£Όμ†Œ λ₯Ό 0X408EE0으둜 μ„€μ •ν•˜μ˜€λ‹€.

 

이 μ½”λ“œκ°€ ν¬ν•¨λœ ν•¨μˆ˜ κ΅¬κ°„μ—μ„œ 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ 0x408EE0의 μ½”λ“œκ°€ μˆ˜ν–‰λœλ‹€.

β“μ—μ„œ RaiseException() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ μ˜ˆμ™Έμ‚¬ν•­μ΄ λ°œμƒν•˜μ—¬ 이 μ£Όμ†Œλ‘œ μ΄λ™ν•œλ‹€.

μ˜ˆμ™Έ 사항을 νšŒν”Όν•˜λ©΄ ⓐ λΆ€λΆ„ λ§ˆμ§€λ§‰ μ½”λ“œμΈ “jmp 0x401AAA”둜 μ΄λ™ν•˜κ³  ν”Œλž˜κ·Έ 값을 μ„€μ •ν•œλ‹€. 0x429F74 값은 λ‹€μ‹œ 1 μ¦κ°€λœλ‹€

 

function #2: call 0x401A50 - μ•ˆν‹° 디버깅 우회

 

 


 

function #3: call 0x401B00 - 뢄석

 

 

ⓐ GetThreadContext() ν•¨μˆ˜ μ‚¬μš©

 

 

  • getThreadContext() : ν˜„μž¬ 싀행쀑인 μ“°λ ˆλ“œμ— λŒ€ν•œ μ»¨ν…μŠ€νŠΈλ₯Ό 가져와 μˆ˜μ •
  • OpenThread()둜 λ°›μ•„μ˜¨ ν•Έλ“€κ³Ό [edp-2D0] μ£Όμ†Œλ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ 전달
  • ContextFlags [edp-2D0]λŠ” 0x10010이고, 4byteμ”© λ’€μ˜ μ£Όμ†Œκ°€ DR0~DR3 λ ˆμ§€μŠ€ν„°μž„
  • DR0λΆ€ν„° DR3κΉŒμ§€ ν•˜λ‚˜λΌλ„ 쀑단점이 μ„€μ •λ˜μ–΄ 있으면 ecxκ°€ 0이 μ•„λ‹Œ 값을 가짐

 

β“‘ ν”Œλž˜κ·Έ 루틴

 

 

  • OR μ—°μ‚° κ²°κ³Ό ecxκ°€ 0이 μ•„λ‹ˆλ©΄ ZFκ°€ 0이 됨
  • SETNE λͺ…λ ΉμœΌλ‘œ ebx에 1이 μ €μž₯ / ebxκ°€ 1(zf=0)이면, eax에 1이 μ €μž₯
  • κ²°κ΅­ 디버깅 쀑이면 μ•„λž˜ μ½”λ“œκ°€ μ‹€ν–‰λ˜μ§€ μ•ŠμŒ / [0x429F74] 값은 λ‹€μ‹œ 1증가

 

function #3: call 0x401B00 - μ•ˆν‹° 디버깅 우회

 

 


 

function #4: call 0x401C20 - 뢄석

 

 

ⓐ PEB ꡬ쑰체의 멀버λ₯Ό ν†΅ν•œ μ•ˆν‹° 디버깅 탐지

  • PEB ꡬ쑰체의 멀버 λ³€μˆ˜λ‘œ λ””λ²„κ±°μ˜ λ™μž‘ 유무λ₯Ό 탐지
  • 0x02 : BeingDebugged (1byte) / 0x68 : NtGlobalFlag (4byte)
  • PEB κ΅¬μ‘°μ²΄λŠ” fs:[30]에 있음
  • 0x68번째 값이 0이 μ•„λ‹ˆλ©΄ ecx = 1
  • 0x02번째 값이 0이 μ•„λ‹ˆλ©΄ ecx 값을 1 증가

β“‘ ν”Œλž˜κ·Έ 루틴

  • ecxκ°€ 2이면 eaxκ°€ 1둜 섀정됨
  • eaxκ°€ 1이 μ•„λ‹ˆλ©΄ ν”Œλž˜κ·Έ 루틴이 μˆ˜ν–‰λ˜μ§€ μ•ŠμŒ
  • [0x429F74] 값은 λ‹€μ‹œ 1증가

 

function #4: call 0x401C20 - μ•ˆν‹° 디버깅 우회

 

 


 

4. μ•ˆν‹° 가상머신


QueryDosDevice() API ν™œμš©

 

MS-DOS μž₯치 정보λ₯Ό κ°€μ Έμ˜€κ±°λ‚˜ VBoxMinRdrDN, VBoxGuest와 같은 가상머신 μž₯μΉ˜μ΄λ¦„μ΄ 포 ν•¨λ˜μ–΄ μžˆλŠ”μ§€ 확인

 

가상머신 λ¬Έμžμ—΄μ΄ 있으면 μ‰½κ²Œ μ•ˆν‹° 가상머신 기법이 μ‚¬μš©λ˜λŠ”μ§€λ₯Ό μ•Œ 수 있음

→ μ€‘μš”ν•œ λ¬Έμžμ—΄μ„ ν•΄μ‹œκ°’μœΌλ‘œ ν‘œν˜„

 

function #5: call 0x402730 - 뢄석

 

 

ⓐ λ¬Έμžμ—΄ ν•΄μ‹œκ°’ 처리

 

- λ¬Έμžμ—΄ (VBoxMiniRdrDN) ν•΄μ‹œ 처리

 

 

- λ¬Έμžμ—΄ (VBoxGuest) ν•΄μ‹œ 처리

 

 

 

function #5: call 0x402730 - μ•ˆν‹° 디버깅 우회

 


 

 

 

2.3.2 function #6: call 0x402880 - 뢄석

 

 

ⓐ Virtual Box와 κ΄€λ ¨λœ λ ˆμ§€μŠ€νŠΈλ¦¬ ν‚€ 확인

 

- RegOpenKeyA() APIλ₯Ό μ‚¬μš© -> λ ˆμ§€μŠ€νŠΈλ¦¬ ν‚€μ˜ 정보 확인

 

 

β“‘ 가상머신과 디버깅 κ΄€λ ¨ λͺ¨λ“ˆ 탐지

 

- CreateToolhelp32Snapshot() API μ‚¬μš© – 32bit ν”„λ‘œμ„ΈμŠ€μ˜ μŠ€λƒ…μƒ·μ„ κ°€μ Έμ˜΄

: ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€μ˜ 정보λ₯Ό κ°€μ Έμ˜΄

 

- Module32First() API μ‚¬μš© – ν”„λ‘œμ„ΈμŠ€μ™€ κ΄€λ ¨λœ 첫 λͺ¨λ“ˆ 정보λ₯Ό 검색

: λͺ¨λ“ˆ μ •λ³΄μ˜ ν•΄μ‹œκ°’μ„ λ³€ν™˜ν•˜κ³  Module32First()ν•¨μˆ˜μ™€ Module32Next()ν•¨μˆ˜λ‘œ 검색

 

→ 두 APIλ₯Ό μ‚¬μš©ν•˜μ—¬ ν˜„μž¬ ν”„λ‘œμ„ΈμŠ€μ˜ μŠ€λƒ…μƒ·μ„ κ°€μ Έμ™€μ„œ ν”„λ‘œμ„ΈμŠ€ μ •λ³΄μ—μ„œ νŠΉμ • μ΄λ¦„μ˜ ν”„λ‘œ μ„ΈμŠ€λ₯Ό ν™•μΈν•˜μ—¬ κ°€μƒν™˜κ²½ κ΄€λ ¨λœ ν”„λ‘œμ„ΈμŠ€μ˜ μ‘΄μž¬μΈμ§€ ν™•μΈν•œλ‹€.

 

function #6: call 0x402880 - μ•ˆν‹° 디버깅 우회

 


 

function #7: call 0x402B70 – 뢄석

 

Module32First

 

function #7: call 0x402B70 - μ•ˆν‹° 디버깅 우회

 

 


 

function #8: call 0x402DE0 – 뢄석

 

Process32First

 

function #8: call 0x402DE0 - μ•ˆν‹° 디버깅 우회

 

 


 

function #9: call 0x401BC0 - 뢄석

 

κ²½κ³Όμ‹œκ°„ 비ꡐ

 

function #9: call 0x401BC0 - μ•ˆν‹° 디버깅 우회

 


 

5. rdtsc λͺ…λ Ήμ–΄λ‘œ κ²½κ³Ό μ‹œκ°„ 비ꡐ (μ•ˆν‹° 디버깅)



6. 파일 패치


 

9개 ν•¨μˆ˜λ₯Ό λ‹€ μš°νšŒν•˜κ³  λ‚˜λ©΄ 파일 패치λ₯Ό 톡해 μƒˆ 파일 생성

 

 

첫 번째 우회 결과

 

 

두 번째 우회의 힌트둜 μ‚¬μš©ν•  수 μžˆλŠ” λ¬Έμžμ—΄ “You are on the right track!” λ©”μ‹œμ§€ λ°•μŠ€ 확인

 


7. 패치 파일둜 디버깅 진행


μ•žμ—μ„œ μ–»μ—ˆλ˜ μžμ—΄ κ²€μƒ‰ν•˜μ—¬ ν•΄λ‹Ή μœ„μΉ˜λ‘œ 이동

 

 

μ•žμ—μ„œ 1μ°¨ 디버깅 우회둜 μ–»μ—ˆλ˜ 두 번째 λ©”μ‹œμ§€λ°•μŠ€μ— “Better luck next time!”을 힌트둜 ν•΄λ‹Ή λ¬Έμžμ—΄ μœ„μΉ˜λ‘œ μ΄λ™ν•˜μ—¬ κ·Έ μœ„μΉ˜μ—μ„œ 쀑단점(f2)을 κ±Έμ–΄μ€€λ‹€.

 

디버깅 λ‹€μ‹œ 진행

 

 

첫 번째 λ¬Έμžμ—΄ “I am so sorry...”κ°€ λ‚˜μ˜€κΈ° μ „ jne와 μ•ˆν‹° 디버깅이 λ™μž‘ν•˜λ˜ call ν•¨μˆ˜μ—λ„ 쀑단 점(f2)을 건 후에 μ‹€ν–‰μ‹œμΌœλ³΄μ•˜λ‹€

 

 

μ•”ν˜Έν™” μƒνƒœμ˜€λ˜ url 값이 μš°νšŒν•˜κ³  μ§€λ‚˜μ˜¨ 후에 λ³΅ν˜Έν™”λœ 것을 ν™•μΈλ˜μ—ˆλ‹€.

 

ν•΄λ‹Ή url을 λ³΅μ‚¬ν•˜μ—¬ 인터넷 μ£Όμ†Œμ°½μ— μž…λ ₯ν•˜λ©΄ λ‹€μŒκ³Ό 같이 μ•”ν˜Έν™”(XOR)된 μ•…μ„±μ½”λ“œκ°€ λœ¨λŠ” 것을 λ³Ό 수 μžˆλ‹€.

 

 

λ³΅ν˜Έν™” 방법은 λ”°λ‘œ μžˆκ² μ§€λ§Œ, μ—¬κΈ°μ„œλŠ” 미리 μ•Œκ³ μžˆλ˜ νŠΉμ • 데이터λ₯Ό μ‚¬μš©ν•˜μ—¬ XOR λ³΅ν˜Έν™”λ₯Ό 수 ν–‰ν•œλ‹€. λ©”λͺ¨μž₯을 μΌœμ„œ malwarebytes 라고 μž…λ ₯ν•œ ν›„ λ³΅μ‚¬ν•˜κΈ°λ₯Ό 톡해 ν΄λ¦½λ³΄λ“œμ— μ €μž₯ν•΄μ€€λ‹€.

 

 

볡사 ν›„ 디버깅을 λ‹€μ‹œ 싀행해보면 “You are one the right track!” λ¬Έμžμ—΄ μœ„μΉ˜κΉŒμ§€ 디버깅이 μ‹€ ν–‰λ˜μ—ˆλ‹€.

그리고 μ•„λž˜ μœ„μ—μ„œ 봀던 μ•…μ„±μ½”λ“œλ“€μ΄ λ‹€μš΄λ‘œλ“œ 된 것 λ˜ν•œ 확인할 수 μžˆλ‹€.

 

 


8. ν”„λ‘œμ„ΈμŠ€ ν• λ‘œμž‰ 기법


κ·Έ 전에 [λ‹€μŒμ„ μ°ΎκΈ°] → [ν˜„μž¬ λͺ¨λ“ˆ] [λͺ¨λ“ˆκ°„ 호좜]을 톡해 이 ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©λ˜λŠ” λͺ¨λ“ˆλ“€ 을 ν™•μΈν•΄λ³΄μ•˜λ‹€. setThreadContext / ResumeThread 등을 확인할 수 μžˆλ‹€.

 

  • setThreadContext : ν˜„μž¬ 싀행쀑인 μ“°λ ˆλ“œμ— λŒ€ν•œ μ»¨ν…μŠ€νŠΈλ₯Ό κ°€μ Έμ™€μ„œ μˆ˜μ •
  • ResumeThread : ν˜„μž¬ μ“°λ ˆλ“œλ₯Ό 쀑지/μž¬μ‹œμž‘

 

ν•΄λ‹Ή λͺ¨λ“ˆ μœ„μΉ˜λ‘œ μ΄λ™ν•˜μ—¬ 쀑단점을 κ±Έμ–΄μ€€λ‹€

 

 

쀑단점을 건 ν›„ 계속 μ‹€ν–‰ν•˜λ‹€λ³΄λ©΄ SetThreadContextκΉŒμ§€ 싀행점이 온 것을 확인할 수 μžˆλ‹€.

μœ„μ—μ„œ 봀던 μ•…μ„±μ½”λ“œμ˜ μ•”ν˜Έκ°€ ν’€λ Έλ‹€λŠ” 것이닀.

 

Suspend λͺ¨λ“œλ‘œ ν”„λ‘œμ„ΈμŠ€ μ‹€ν–‰

 

Suspend λͺ¨λ“œλ‘œ rundll32.exeλ₯Ό μ‹€ν–‰ν•œλ‹€.

 

μ‚¬μš©μž ν”„λ‘œμ„ΈμŠ€μ˜ μ§„μž…μ  μ°ΎκΈ°

 

μ€‘λ‹¨λœ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ””λ²„κΉ…ν•˜λ €λ©΄ Suspend μƒνƒœμ˜ rundll32.exe ν”„λ‘œμ„ΈμŠ€λ₯Ό λ””λ²„κ±°λ‘œ λΆ€μ°©ν•˜κ³  쀑 단점을 EP에 μ„€μ •ν•œλ‹€.

 

rundll32.exeλ₯Ό λ””λ²„κ±°λ‘œ λΆ€μ°©

EIP μˆ˜μ •ν•˜κ³  계속 μˆ˜ν–‰ν•˜κΈ°

 

 

디버거에 λΆ€μ°©λœ rundll32.exe 쀑단점을 μ„€μ •ν•œλ‹€

 

 

쀑단점 μ„€μ • ν›„ λ‹€μ‹œ sample.exe λ””λ²„κ±°λ‘œ λŒμ•„μ™€μ„œ μ΄μ–΄μ„œ 싀행해보면 rundll32.exe 디버거 λ‚΄μš© 이 달라진 것을 확인할 수 μžˆλ‹€.

  • SetThreadContext() APIλ₯Ό μ‚¬μš©ν•˜μ—¬ PE의 EPκ°€ μ €μž₯된 μ“°λ ˆλ“œ μ»¨ν…μŠ€νŠΈλ₯Ό λ³€κ²½
  • ResumeThread() APIλ₯Ό μ‚¬μš©ν•˜μ—¬ μ€‘λ‹¨λ˜μ—ˆλ˜ μƒˆλ‘œμš΄ rundll32.exe ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰

 

 

 

9. 성곡 λ©”μ‹œμ§€ 좜λ ₯


 

성곡 λ©”μ‹œμ§€ 좜λ ₯ 쑰건

 

  • ν˜„μž¬ 디버깅 쀑인 “rundll32.exe”이 system32 κ²½λ‘œμΈμ§€ 확인
  • μ‹€ν–‰ 쀑인 ν”„λ‘œμ„ΈμŠ€μ˜ μœˆλ„μš° 이름 쀑 ν”„λ‘œμ„ΈμŠ€ μ΅μŠ€ν”Œλ‘œ(“procexpl.exe”)κ°€ μžˆλŠ”μ§€ 확인
  • μœ„ 두 쑰건을 λ§Œμ‘±ν•˜λ©΄ “rundll32.exe”λŠ” ν”„λ‘œμ„ΈμŠ€ μ΅μŠ€ν”Œλ‘œλŸ¬μ— μ‰˜μ½”λ“œλ₯Ό μΈμ μ…˜ μ‹œμΌœ μ‹€ν–‰

 

μΈμ μ…˜μ— μ„±κ³΅ν•˜λ©΄ λ‹€μŒκ³Ό 같이 μ„±κ³΅λ©”μ‹œμ§€κ°€ ν”„λ‘œμ„ΈμŠ€ μ΅μŠ€ν”Œλ‘œλŸ¬λ₯Ό 톡해 μ‹€ν–‰λœ 것을 확인할 수 μžˆλ‹€.

 

λ°˜μ‘ν˜•