반응형


FSC_Level2.exe

언팩하면 바로 나오는 문제인줄 알았는데, 막상 까보니까 원하는 문자열이 %x로 되어있네요 

결국은 실행시켜야 되는 문제였습니다

그리고 UPX 언패킹하는거 손으로 해보려다가 삽질만 계속하고 수확이 없네요 .. 그래서 일단은 툴로 돌렷습니다. 

계속해볼건데 아직은 발전이 없네요 


여튼 문제에서 UPX가 걸려있다는걸 확인해주고 언패킹을 해줍니다 .

IDA에서도 어떤 형식으로 패킹된지 알수 있지만, PEID를 사용하여 패킹된 상태를 확인하였습니다 


다음으로 UPX를 언패킹해주게 되면 우리가 그토록 바라던 진짜코드가 나옵니다 


위의 그림은 cmd창에서 upx를 실행시킨 모습입니다 우리가 원하는 옵션은 decompress 옵션이기 때문에 해당옵션을 주고,

언팩하면 됩니다 (System 32 부분에 받아둔  upx 파일을 넣으시면 됩니다~> 구글링하면 나오니까 따로 첨부안하겟습니다. )


이런식으로 나오게되는데 자세히보시면 %x가 보입니다 ㅡㅡ ; 결국엔 실행 시켜야 키를 준다는 말이군요 





그래서  소스코드를 쫙 분석해 보았습니다(실행시 위의 문자열이 뜨도록 만들어봅시다 )




0x401186부터 한 글자씩 edx에 삽입하는 코드 입니다. 


책을 참고했는데, 예를들어서 FSC_Level2.exe을 C:\Temp\F-secure\에서 실행했다면, edx에 들어가는 문자열은 큰 따옴표로 둘러 싸여서 "C:\Temp\F-Secure\FSC_Level2.exe"가 됩니다 추가적으로 인자 \a 라는것을 붙여주게되면 ,

" "C:\Temp\F-Secure\FSC_Level2.exe" \a" 이렇게 됩니다

(아직 왜이런지는 이해가 안됩니다. 알아내면 수정하겠습니다)


여튼, 위의 코드는 최종 처리를 마치게되면 실행된 파일의 인자를 포함한 전체 경로는 edx에 들어가고, edx는 문자열 마지막 포인터를 가리키게 됩니다.



조금 잘리긴했는데 해당 소스를 보게되면 0x4011E1에서 GetCommandLine()(위소스에서 정의된 함수)으로 구한 값을 이용한 

첫번째 조건문이 등장하게 됩니다. 


CODE:004011C2                 mov     al, [edx-5]

CODE:004011C5                 xchg    eax, [esp+24h+var_24]

CODE:004011C8                 push    esp

CODE:004011C9                 mov     [esp+28h+var_28], eax

CODE:004011CC                 mov     eax, eax

CODE:004011CE                 xchg    eax, [esp+28h+var_28]

CODE:004011D1                 xor     eax, eax

CODE:004011D3                 mov     al, 20h


그 조건문의 루틴이 0x4011C2부터 시작되는데, 코드를 해석해보면, 

edx에 넣은 전체 경로의 맨뒤부터 다섯번째 값을 한바이트 가져오고 그값이 0x20인지 비교합니다(0x4011D3) 아스키 코드표를 

참조하면 0x20값이 "space"라는 것을 확인할 수 있습니다.

그러니까 정리해보면, 입력된 문자열, 여기서는 실행되는 파일의 경로의 다섯번째 값 공백이여야 된다는 것을 의미하고, 

또한, 맨뒤가 공백이여야 하니까 실질적으로 사용할 수 있는 파라미터는 4byte가 된다는 것을 의미합니다. 



다음은 edx-6 부분인데, 위에서 설명한것과 같은 방법으로 여섯 번째 값을 한 바이트 eax에 넣어줍니다. 그리고 그값이 0x22인

지 확인하게 되는데, 마찬가지로 아스키 코드표를 참조하면 큰 따옴표라는 것을 확인할 수 있습니다. 



마찬가지로 edx-A 에서 값을 가져오게 되는데, 0x40123A 번지에서 eax와 비교하는 ESP 부분에서 바로 위의 XOR 한값과 일치해야 합니다. 

그래서 아래 0x40123F의 jnz.. 분기문을 타고 점프하게되면 실패하게되고, 바로 아래로 내려가면 우리가 원하는 congratulation ~ 을 띄우게 됩니다,. 


여기서 중요한게 뭐냐면 edx 레지스터에 들어있는 값이 변하지 않았다는 겁니다. 


즉 문자열을 넣고 변하지 않는 상태에서 적당한 값을 뺴면서 비교하고 있습니다. edx - A 의 경우 A는  10이니까 -A는 뒤에서 

열 번째 자리부터  4byte( 이부분만 Word라서 )를 차지하는 부분입니다 


" "C:\Temp\F-Secure\FSC_Level2.exe" 1234"

여기서는 공백도포함하니까 뒤에서부터 10byte 거슬러올라오게 되면 딱 e에서 부터 4글자가됩니다 .

그리고 비교하는 대상은 [edx-4] 가 되고,( 이부분은 올리디버그로 확인해보시면 더확실하게 이해가 가실겁니다) 

1234라는 파라미터를 가르키게 되겟죠. 

정리해보면 (DWORD).exe ^ 1234 가 되겠고, 우리가 필요한건 .exe와 1234니까 각각  0x6578652E , 0x5528566D

계산해서 아스키로 치환하면 C3P0이 되고, 이 파라미터를 넣어서 실행해주면 congratulation 과 함께 우리가 원한 키값이

나오게됩니다. 


~> 후 ... 계산하는 부분에서 많이 막혀서 결국엔 책을 봐버렷습니다.. . 

반응형
,