Malware/malware analysis

[Agent Tesla ๋ถ„์„ (1)] .NET ๋ถ„์„, ๋‚œ๋…ํ™” ํ•ด์ œํ•˜๊ธฐ(Deobfucator)

์œค์ •_ 2025. 3. 14. 17:54

๊ทธ๋™์•ˆ์˜ ๊ฒŒ์‹œ๊ธ€์—์„œ๋Š” C/C++๋กœ ์ž‘์„ฑ๋œ PE ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ถ„์„ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ์—๋Š” ์ฒ˜์Œ์œผ๋กœ .NET ์•…์„ฑ์ฝ”๋“œ๋ฅผ ํฌ์ŠคํŒ…ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ ํ•ด์‹œ(SHA256)๋Š” ed22dd68fd9923411084acc6dc9a2db1673a2aab14842a78329b4f5bb8453215์ž…๋‹ˆ๋‹ค.

 

 

 

โ—‹ ์ƒ˜ํ”Œ ์ •๋ณด ์ˆ˜์ง‘

๋จผ์ € ํŒจํ‚น ๋ฐ ๋‚œ๋…ํ™” ํ™•์ธ์„ ์œ„ํ•ด DiE๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋‹ˆ .NET Reactor๋กœ ํ”„๋กœํ…ํŠธ ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

DiE๋ฅผ ํ†ตํ•œ ์ƒ˜ํ”Œ ์ •๋ณด ์ˆ˜์ง‘

 

 

dnSpy๋กœ๋„ ํ™•์ธํ•ด๋ณด๋ฉด,

dnSpy ์ฒซ ํ™”๋ฉด์„ ํ†ตํ•ด ์–ป์€ ์ •๋ณด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • 5๊ฐœ์˜ ์ž„๋ฒ ๋””๋“œ๋œ ๋ฆฌ์†Œ์Šค
  • Entry point (WaitCallb.Filter.GlobalValueFilter.MapVisitor)
  • Type References์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋“ค: class, enumeration, structure, delegation
  • ์–ด์…ˆ๋ธ”๋ฆฌ ์ด๋ฆ„: WaitCallb
  • ๋ชจ๋“ˆ ์ด๋ฆ„: WaitCallb.exe
  • 2๊ฐœ์˜ ๋ชจ๋“ˆ

 

 

๊ฐ€๋ณ๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋“ค์„ ๋Œ€๊ฐ• ํ™•์ธํ–ˆ๊ณ  ์ด์ œ EP๋กœ ์ง„์ž…ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

โ—‹ (stage 1) Entry Point  ๋ถ„์„

Entry point ๋ฉ”์„œ๋“œ: MapVistior

 

EP ๋ฉ”์„œ๋“œ์—์„œ๋Š” 4๊ฐœ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๊ณ  ๋ณ€์ˆ˜ num์— ๋”ฐ๋ผ ์‹คํ–‰๋˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์ฒ˜์Œ ์„ค์ •๋˜์–ด ์žˆ๋Š” num์ด 4์ด๋ฏ€๋กœ case 4์˜ Application.EnableVisualStyles()๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

EnableVisualStyles ๋ฉ”์„œ๋“œ

 

EnableVisualStyles ๋ฉ”์„œ๋“œ๋Š” ์ž์ฒด ๋กœ๋“œ๋œ ์–ด์…ˆ๋ธ”๋ฆฌ์˜ ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋งˆ์ง€๋ง‰์— Application.EnableVisualStylesInternal()์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

EnableVisualStyleInternal ๋ฉ”์„œ๋“œ

 

์ด๋ฅผ ํ†ตํ•ด EnableVisualStylesInternal ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ ํŒŒ์ผ ์ด๋ฆ„์ด๊ณ ,
๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜์ธ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฆฌ์†Œ์Šค ID๊ฐ€ 101์ธ ๊ฒƒ๊ณผ,
UnsafeNativeMethods ํด๋ž˜์Šค์˜ CreateActivationContext ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • UnsafeNativeMethods ํด๋ž˜์Šค
    • ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์•ก์„ธ์Šคํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

    • ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•œ ๋‚ด๋ถ€ ํด๋ž˜์Šค

    • .NET์—์„œ๋Š” ์•ˆ์ „ํ•œ ์ฝ”๋“œ(safe code)์™€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ(unsafe code)๊ฐ€ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋Š” unmanaged code๋กœ, ๊ด€๋ฆฌ๋˜์ง€ ์•Š์•„ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค. managed code์ธ .NET ์ฝ”๋“œ์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ๋ถˆ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์ด๋”๋ผ๋„ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

  • CreateActivationContext ๋ฉ”์„œ๋“œ
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” API

    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์ค€๋น„ํ•˜๋Š”๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ COM ๊ฐ์ฒด๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™œ์„ฑํ™” ์ปจํ…์ŠคํŠธ๋ฅผ ์„ค์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

    • COM ๋˜๋Š” .NET ํ™˜๊ฒฝ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์„ ์œ„ํ•œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋ฐ ์–ด์…ˆ๋ธ”๋ฆฌ์™€ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

 

 

CreateActivationContext ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ตฌ์ฒด์ ์ธ DLL ๋ชจ๋“ˆ ๋˜๋Š” COM ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค ๋กœ๋“œ๋ฅผ ์œ„ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ฒด๋ฅผ ์„ค์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ EnableVisualStyles ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ๋‚˜๋ฉด, num ๋ณ€์ˆ˜๋Š” 3์œผ๋กœ ์„ค์ •๋˜๊ณ  2๊ฐœ์˜ ๋ฉ”์„œ๋“œ Application.SetCompatibleTextRenderingDefault()์™€ RecordParam.SelectConfig()๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

MapVistior ๋ฉ”์„œ๋“œ์—์„œ ํ˜ธ์ถœ๋˜๋Š” SetCompatibleTextRenderingDefault์™€ SelectConfig ๋ฉ”์„œ๋“œ

 

 

์ด๋ฅผ ๋์œผ๋กœ swtich ๋ฌธ์ด ์ข…๋ฃŒ๋˜๋ฉด Application.Run(new ReponseListState())๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

MapVistior ๋ฉ”์„œ๋“œ์—์„œ Run์— ์˜ํ•ด ํ˜ธ์ถœ๋˜๋Š” ReponseListState
ReponseListState ๋ฉ”์„œ๋“œ

 

ReponseListState ๋ฉ”์„œ๋“œ๋„ switch-case๋ฌธ๊ณผ ์ƒํƒœ ๋ณ€์ˆ˜ num์„ ํ†ตํ•ด ์‹คํ–‰๋  ์ฝ”๋“œ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

์ฒ˜์Œ ์„ค์ •๋œ num=6์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ€์žฅ ๋จผ์ € RecordParam.SelectConfig()์™€ ReponseListState.PostProcess() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

 

ReponseListState์—์„œ ํ˜ธ์ถœ๋˜๋Š” SelectConfig ๋ฐ PostProcess ๋ฉ”์„œ๋“œ

SelectConfig ๋ฉ”์„œ๋“œ๋Š” ์•„๋ฌด ์ž‘์—… ํ•˜์ง€ ์•Š๊ณ  PostProcess๋Š” false๋งŒ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  num์€ 2๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

 

case 2๋Š” IL_0C ๋ ˆ์ด๋ธ”๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

ReponseListState ๋ฉ”์„œ๋“œ์˜ IL_0C

 

IL_0C์—์„œ๋Š” ctor, CompareVisitor, PostProcess ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ์ค‘ CompareVisitor ๋ฉ”์„œ๋“œ์— ๋“ค์–ด๊ฐ€๋ณด๋ฉด 258๋ฒˆ์งธ ์ค„์—์„œ this.Text = "Form 1" ๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CompareVisitor ๋ฉ”์„œ๋“œ์˜ Text ์†์„ฑ ํ˜ธ์ถœ

 

์—ฌ๊ธฐ์„œ "Text" ์†์„ฑ์€ ์ ‘๊ทผ์ž/๋ณ€๊ฒฝ์ž(accessor/mutator)์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ณ , ์•„๋ž˜ ๊ทธ๋ฆผ์˜ 292๋ฒˆ์งธ ์ค„์—์„œ ๋‹ค๋ฅธ ์ ‘๊ทผ์ž/๋ณ€๊ฒฝ์ž๋กœ ์˜ค๋ฒ„๋ผ์ด๋“œ๋ฉ๋‹ˆ๋‹ค.

 

  • ์ ‘๊ทผ์ž(accessor)
    • ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ํ•„๋“œ ๊ฐ’์„ ์ฝ๋Š” ๋ฉ”์„œ๋“œ๋กœ, ํ•„๋“œ์˜ ๊ฐ’์„ ์™ธ๋ถ€์—์„œ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ
    • ํด๋ž˜์Šค์˜ private ํ•„๋“œ์— ๋Œ€ํ•ด ์™ธ๋ถ€์—์„œ ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ
    • get ์ ‘๊ทผ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋˜๋ฉฐ getter๋ผ๊ณ ๋„ ๋ถˆ๋ฆผ

  • ๋ณ€๊ฒฝ์ž(mutator)
    • ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ํ•„๋“œ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋กœ, ํ•„๋“œ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ
    • ํด๋ž˜์Šค์˜ private ํ•„๋“œ์— ๋Œ€ํ•ด ์™ธ๋ถ€์—์„œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ
    • set ์ ‘๊ทผ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋˜๋ฉฐ setter๋ผ๊ณ ๋„ ๋ถˆ๋ฆผ

  • ์˜ค๋ฒ„๋ผ์ด๋“œ(override)
    • ๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ
    • ๊ฐ™์€ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ๋Œ€ํ•ด ์ž์‹ ํด๋ž˜์Šค๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹คํ˜•์„ฑ(polymorphism)์„ ์ง€์›ํ•˜๊ณ , ์ฝ”๋“œ ์œ ์—ฐ์„ฑ์„ ๋†’์—ฌ์คŒ

 

์˜ค๋ฒ„๋ผ์ด๋”ฉ๋œ ์ ‘๊ทผ์ž ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœ๋œ ResetVistior ๋ฉ”์„œ๋“œ

 

์˜ค๋ฒ„๋ผ์ด๋”ฉ๋œ ์ ‘๊ทผ์ž ๋‚ด๋ถ€์—์„œ๋Š” ResetVisitor ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

 

 

ResetVisitor ๋ฉ”์„œ๋“œ: ๋ฆฌ์†Œ์Šค ๋กœ๋“œ

ResetVisitor()๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด 5๋กœ ์„ธํŒ…๋œ ์ƒํƒœ ๋ณ€์ˆ˜์— ์˜ํ•ด case 5๊ฐ€ ์‹คํ–‰๋˜์–ด ๋จผ์ €ResourceManager ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™”๋˜๊ณ , (case 3) Vargo ๋ฆฌ์†Œ์Šค๊ฐ€ array ๋ณ€์ˆ˜์— ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น array ๋ณ€์ˆ˜์—๋Š” ๋กœ๋“œ๋˜์–ด ์‹คํ–‰๋  ์ธ์ฝ”๋”ฉ๋œ .NET ๋ชจ๋“ˆ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ text ๋ณ€์ˆ˜์— XOR ํ‚ค๋ฅผ ์„ค์ •ํ•˜๊ณ  case 2๋กœ ์ด๋™ํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ํฌ๊ธฐ(num2)๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

 

๋กœ๋“œ๋œ ๋ฆฌ์†Œ์Šค(.NET ๋ชจ๋“ˆ)์™€ ์„ค์ •ํ•œ ํ‚ค, ๋ฆฌ์†Œ์Šค ํฌ๊ธฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋””์ฝ”๋”ฉ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ResetVisitor ๋ฉ”์„œ๋“œ: ๋””์ฝ”๋”ฉ ๊ณผ์ •

 

 

์ด์ œ ์‹คํ–‰ํ•˜์—ฌ ์ƒ์„ฑ๋˜๋Š” ๋ชจ๋“ˆ์„ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ฉ”์„œ๋“œ ๊ณผ์ •์„ ๋ชจ๋‘ ๋งˆ์น˜๋ฉด array ๋ณ€์ˆ˜์— ๋””์ฝ”๋”ฉ๋œ, 4D5A(MZ)๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ”์ดํŠธ๋“ค์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

๋””์ฝ”๋”ฉ๋œ PE ๋ฐ”์ด๋„ˆ๋ฆฌ

 

 

๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“ˆ ๋ชฉ๋ก์„ ํ™•์ธํ•ด๋ณด๋ฉด ์ƒˆ๋กœ์šด ๋ชจ๋“ˆ SharpStructures๊ฐ€ ๋กœ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋กœ๋“œ๋œ ๋ชจ๋“ˆ SharpStructures

 

 

์ถ”์ถœ๋œ ๋ชจ๋“ˆ์„ DiE๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด๋ณด๋ฉด Smart Assembly Obfuscator๋กœ ๋‚œ๋…ํ™”๋˜์–ด ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DiE๋กœ ํ™•์ธํ•œ SharpStructures

 

 

๋˜ํ•œ dnSpy๋ฅผ ํ†ตํ•ด์„œ ์œ ๋‹ˆ์ฝ”๋“œ ํ‘œ๊ธฐ(\u)์™€ SmartAssembly ๊ด€๋ จ ์†์„ฑ๋“ค์ด ํ™•์ธ๋œ ๊ฒƒ์œผ๋กœ๋„ ๋‚œ๋…ํ™”๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

dnSpy๋ฅผ ํ†ตํ•œ SharpStructures

 

 

 

โ—‹ (stage 2) SharpStructures ๋ถ„์„

- ๋‚œ๋…ํ™” ํ•ด์ œํ•˜์—ฌ ๋กœ๋“œํ•˜๊ธฐ

์ถ”์ถœํ•œ SharpStructures ๋ชจ๋“ˆ์„ ๋‚œ๋…ํ™” ํ•ด์ œํ•ด์„œ ์‹คํ–‰๋˜๋˜ .NET ๋ฐ”์ด๋„ˆ๋ฆฌ์— ๋Œ์•„๊ฐ€์„œ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ชจ๋“ˆ์„ de4dot์„ ํ†ตํ•ด .NET ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ๋‚œ๋…ํ™”๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

de4dot์„ ํ†ตํ•œ ๋‚œ๋…ํ™” ํ•ด์ œ

 

 

๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ์‹คํ–‰ํ•ด์„œ Assembly.Load(arrary) (370๋ฒˆ์งธ ์ค„)๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์—์„œ ๋ฉˆ์ถ”๊ณ , array ๋ฐฐ์—ด์— ๋Œ€ํ•ด memory ํƒญ(Memory 1)์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. 

๋ณ€์ˆ˜ array ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ณด๊ธฐ
๋ฉ”๋ชจ๋ฆฌ์—์„œ์˜ ๋ณ€์ˆ˜ array ๋ฐ์ดํ„ฐ

 

๋‚œ๋…ํ™” ํ•ด์ œํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ๋ฎ์–ด์จ์ฃผ๋ฉด, ๋‚œ๋…ํ™” ํ•ด์ œ๋œ ๋ชจ๋“ˆ๋กœ ๊ต์ฒดํ•ด์ฃผ๋Š” ์ž‘์—… ์™„๋ฃŒ์ž…๋‹ˆ๋‹ค.

 

 

GetMethod() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด SharpSturctures ๋ชจ๋“ˆ์˜ InvalidCast ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ์žˆ์œผ๋‹ˆ ํ•ด๋‹น ๋ฉ”์„œ๋“œ ์‹œ์ž‘ ๋ถ€๋ถ„์— breakpoint๋ฅผ ๊ฑธ๊ณ  ์‹คํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

FuillName ์†์„ฑ์—์„œ ์–ป์€ InvalidCast ๋ฉ”์„œ๋“œ ์ •๋ณด
SharpStructures.Sorting.SortHelper ํด๋ž˜์Šค์˜ InvalidCast ๋ฉ”์„œ๋“œ

 

 

Invoke ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด InvalidCast ๋ฉ”์„œ๋“œ๋กœ ์ „ํ™˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

InvalidCast ๋ฉ”์„œ๋“œ๋กœ ์ „ํ™˜์„ ์ˆ˜ํ–‰
InvalidCast ๋ฉ”์„œ๋“œ๋กœ ์ „ํ™˜๋จ

 

 

์ด์ œ ์ „ํ™˜๋œ ๋ชจ๋“ˆ์„ ๋ถ„์„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

- SharpStructures(stage2) ๋ถ„์„ํ•˜๊ธฐ

InvalidCast ๋ฉ”์„œ๋“œ์—์„œ ๋งŽ์ด ํ˜ธ์ถœ๋˜๋Š” Class0 ํด๋ž˜์Šค๋ฅผ ๋ถ„์„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

smethod_0๊ณผ smethod_1 ๋ฉ”์„œ๋“œ

smethod_0๊ณผ smethod_1์€ ๋ฐฐ์—ด ์กฐ์ž‘(manipulating)ํ•˜๋Š” ๋™์ผํ•œ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

 

 

smethod_2์™€ smethod_4 ๋ฉ”์„œ๋“œ

smethod_2์™€ smethod_4์€ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ(Invoke)ํ•˜๋Š” ๋™์ผ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

 

 

smethod_3๊ณผ smethod_6 ๋ฉ”์„œ๋“œ

smethod_3๊ณผ smethod_6์€ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ๋กœ๋“œ(Assembly.Load)ํ•˜๋Š” ๋™์ผ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

 

 

smethod_5์™€ smethod_7 ๋ฉ”์„œ๋“œ

smethod_5์™€ smethod_7์€ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๋Š” ๋™์ผ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

 

์ด 8๊ฐœ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์ง€๋งŒ ๋™์ผํ•œ ์ฝ”๋“œ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์ค‘๋ณต๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋Šฅ์ ์œผ๋กœ๋Š” 4๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

 

๋‹ค์‹œ InvalidCast ๋ฉ”์„œ๋“œ๋กœ ๋Œ์•„์˜ค๋ฉด 25๋ฒˆ์งธ ์ค„์— DemandedResources ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

DemandedResources ๋ฉ”์„œ๋“œ

DemandedResources ๋ฉ”์„œ๋“œ๋Š” ResourcesManager ํด๋ž˜์Šค๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜์—ฌ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๊ณ  smethod_5์—์„œ ์ƒ์„ฑ๋˜์–ด ์ฃผ์–ด์ง„ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์—์„œ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

 

๋˜ํ•œ InvalidCast ๋ฉ”์„œ๋“œ 26๋ฒˆ์งธ ์ค„์˜ ConstructionResponse ๋ฉ”์„œ๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด

ConstructionResponse ๋ฉ”์„œ๋“œ

 

smethod_1์—์„œ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด bytes์„ ๋ฐ›์•„ ๋น… ์—”๋””์•ˆ ์ˆœ์„œ ํ˜•์‹(UTF-16)์œผ๋กœ ๋ฎ์–ด์”๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  bytes์˜ ๋งˆ์ง€๋ง‰ ๋ฐ”์ดํŠธ์™€ ์ˆซ์ž 112๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ XOR ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ ํ• ๋‹นํ•œ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด array์— ๋‘ ๋ฒˆ์˜ XOR ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ bytes๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด array์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•œ ํ›„ ์ตœ์ข… ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ConstructionResponse ๋ฉ”์„œ๋“œ๋Š” XOR ์—ฐ์‚ฐ์„ ํ†ตํ•œ ๋””์ฝ”๋”ฉ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

InvalidCast ๋ฉ”์„œ๋“œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

InvalidCast ๋ฉ”์„œ๋“œ

 

[line 26]

๋ฆฌ์†Œ์Šค์—์„œ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋ฅผ ์ฝ์–ด์˜ค๊ณ (smethod_5), ๊ทธ ๋ฆฌ์†Œ์Šค์˜ ์ด๋ฆ„์€ smethod_1 ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.
ConstructionResponse ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋””์ฝ”๋”ฉํ•˜๋ฉด ๊ฒฐ๊ณผ ๋ฐฐ์—ด์˜ ์ฝ˜ํ…์ธ ๋Š” ๋˜ ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.

[line 27]

๋˜ํ•œ ๊ฒฐ๊ณผ ๋ฐฐ์—ด์€ smethod_6(Assembly.Load)์— ์˜ํ•ด ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.
๋ชจ๋“  ์œ ํ˜•์€ ๋กœ๋“œ๋œ ์–ด์…ˆ๋ธ”๋ฆฌ์— ์˜ํ•ด ๋ฐ˜ํ™˜๋˜๊ณ  ๊ทธ๋“ค ์ค‘ ํ•˜๋‚˜๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.

[line 28-29]

GetTypes()๋กœ ๋ฐ˜ํ™˜๋œ ํƒ€์ž…์— ๋Œ€ํ•ด ๋ชจ๋“  public ๋ฉ”์„œ๋“œ๊ฐ€ GetMethods()๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ˜ํ™˜๋˜๊ณ  ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.

[line 30]

๋งˆ์ง€๋ง‰์œผ๋กœ ์„ ํƒ๋œ ๋ฉ”์„œ๋“œ๋Š” smethod_4(Invoke)๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

 

 

InvalidCast ๋ฉ”์„œ๋“œ ํ†ตํ•ด์„œ ์ƒˆ๋กœ์šด ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๊นŒ๋ž‘ ๋˜‘๊ฐ™์ด ์‹คํ–‰ํ•˜๋ฉด์„œ ๋”ฐ๋ผ๊ฐ€๋ณด๋‹ˆ byte_์— PE ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ๋กœ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

byte_ ๋ฐฐ์—ด์— ๋กœ๋“œ๋œ PE ๋ฐ”์ด๋„ˆ๋ฆฌ

 

ํ•œ ๋ฒˆ ๋” ์‹คํ–‰ํ•˜์—ฌ smethod_6(Assembly.Load) ๋ฉ”์„œ๋“œ๋กœ ๋กœ๋“œํ•˜๋ฉด ๋ชจ๋“ˆ ๋ชฉ๋ก์—์„œ๋„ ์ƒˆ ๋ชจ๋“ˆ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋กœ๋“œ๋œ DotNetZipAdditionalPlatforms ๋ชจ๋“ˆ

 

2๋ฒˆ์งธ๋กœ ๋กœ๋“œ๋œ DotNetZipAdditionalPlatforms ๋ชจ๋“ˆ์˜ ํด๋ž˜์Šค ๋ฐ ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์ด ๊ฐ LajJueXX7RvrQwTLPl.XcuCxUwDbNNwbx89AI, RrRUhxJmfM์ธ ๊ฒƒ๊ณผ, DiE๋ฅผ ํ†ตํ•ด ํ™•์ธํ•œ .NET Reactor ์‚ฌ์šฉ์œผ๋กœ ๋ณด์•„ ํ•ด๋‹น ๋ชจ๋“ˆ์€ ๋‚œ๋…ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

DiE๋กœ ๋ณธ DotNetZipAdditionalPlatforms ๋ชจ๋“ˆ

 

 

 

ํฌ์ŠคํŒ…์ด ๋„ˆ๋ฌด ๊ธธ์–ด์ ธ์„œ ๋‹ค์Œ๋ฒˆ์— ์ด์–ด์„œ ๋ถ„์„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

Ref. "Malware Analysis Series(MAS) – Article 4", Alexandre Borges