'과거의 컴퓨터 공부/reversing writeup'에 해당하는 글 3건

반응형

점점 답에 가까워지고있습니다 .. .근데 점점 풀기싫어지는게 함정 .. 


FSC_Level3.exe


처음엔 패킹도 안되있고 바로 congratulation이 보이길래 ..  개나소나 취직하는 곳이나 싶었는데 ... 

소스 보다보면 아시겠지만 시리얼추출 관련루틴이 코빼기도 보이지가 않습니다 ...ㅇㄴ.. 

어케할 수가 없더군요 그래서 step in으로 쑥쑥 들어가 보았습니다

그렇게 삽질하던 도중 .. 

말도안되게 쨤프를 해버립니다  뭔가 수상해요 냄새가 납니다(애초에 이프로그램 자체가 용량도 그렇게 큰편이 

아니라서 보통 프로그램이라면 이렇게 말도안되게 멀리 쨤프를 할리가 없죠) 어디로 쨤프하는지 가봅시다

헬게이트 오픈입니다 .. 

코드를 보면 뭔가 억지스러운 코드도 있긴한데, 잘보면 정상적인 코드도 존재하네요 

그러니까 생각을 정리해보면 연산코드(시리얼 추출 관련 루틴)는 다 여기서 수행되는거라 보면 됩니다

다시말하면, 초기화 부분에서 각종 Allocate 구문이 가동되고, 중요 연산코드가 모두 이곳에서 수행되는 겁니다 

이런 기법을 사용하는건 보통 패킹에서 사용하는 기법인데, 

이 프로그램에서 패킹이 되있는건 확인할 수 없었죠.. 

"자체패킹" ... 

그리고 이 문제는 리다이렉트까지 걸려있어서 분석하는데 애좀먹었습니다 

결과부터 말해보면 코드 하나 알아내고 따른동네로 넘어가고 방정식도 써야되고 이런식입니다 

우선 첫번째 코드입니다 (풀고나서 주소만 메모장에 적어놔가지고 각레지스터에 어떤값이 들어있는지는 잘라버렸습니다 ) 


허벌나게 리다이렉트 되있어서  쨤프를 하다보면 이런문이 나옵니다 (이 소스가나오기전에 ecx 에는 0x10이 들어갑니다) 

괄호쳐놓고 설명했듯 ecx에는 결과적으로 0x10이란 값이들어가고,

 우리가 찾아야할 문자열은 16글자라는 흰트를 얻게됩니다. 여기까지 진행한거로 봐서는 뒤에 내용이 확실하게 

어떤식으로 진행할지 감이안오죠 또 허벌나게 쨤프하다보면 다음과 같은 소스가 나옵니다

 (리다이렉트가 너무많아요 .. 필요한 부분만 긁어오겠습니다 뒤에가다보면 리다이렉트를 몇백번을 해논거도 있어서,,, 하 .. 양해부탁드립니다) 


0041288F    BA8B 68000000            MOV CL, BYTE PTR DS: [EBX+68] 

00412896    388B 64000000            CMPB BYTE PTR DS: [EBX+68],%CL

0041289C    75 01                    JNE $0041289F

0041289E    40                       INCL %EAX

0041289F    8883 64000000            MOVB %AL,%DS:64(%EBX)

004128A5    E9 F6150000              JMP $00413EA0

004128AA    00C7                     ADDB %AL,%BH


~> BYTE PTR DS: [EBX+68]에 'S'가 들어있는지 검사

자 그러면 이제 한문자 알았네요

S - - - - - - - - - - - - - - -
 
이런방식으로 두문자를 더얻게 됩니다 해당 코드는 각각 0x4108A7 , 0x4107A0에 존재하니 따라가보시길 .. 

결과적으로 


S a - j - - - - - - - - - - - -


줄인다고 줄이고있는데 암에 걸릴것만 같습니다 13문자나 남았잔아.. 











반응형
,
반응형


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 과 함께 우리가 원한 키값이

나오게됩니다. 


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

반응형
,
반응형


FSC_Level1.exe


예전에 f-secure? 라는 회사에서 대회를 열었는데, 총 3 레벨까지 문제가 있고, 그 문제 중 1번 문제입니다. 

1번 문제라 그런지 저도 굉장히 쉽게 풀었네요 본론으로 들어가봅시다. 

아직 IDA가 미숙해서 올리디버그랑 병행해서 작성하겠습니다

첨부한 파일을 열어보면 알수 있듯이 굉장히 간단한 프로그램입니다  


키를 물어보는 프로그램인거 같네요 임의의 값을 넣게 되면 다음과 같은 문구가 뜨고 프로그램이 종료됩니다. 


분석할것도 없이 아이다로 열어서 main()부터 쭉내려 보니 conratulation ....과 sorry 문이 보입니다. (공짜로 주는 문젠가 봐요)

(sorry....문자열을 찾아서 문제에 접근하는게 정석입니다)


각 문자열이 저장된 함수로 들어가서 보시면 정확한 문자열을 확인할 수 있습니다 .(원래 이 문제를 풀게되면 메일주소가 나오고 메일 주소로 키값을 보내면 다음 문제의 링크를 줫다고 합니다)



main소스도 살펴보니 굉장히 간단했는데 설명해보자면, int __cdecl stricmp(const char *Str1, const char *Str2)에 인자 

 int __cdecl stricmp(str1 , Dest)이 들어가게되고 Dest는 위에서 보다시피 "\nCongratulations! Please send an e-mail"... 문구가 있는 aCongratulation()입니다 . 


정리해보면 str1 에는 input 값이 들어가게되고, input 값을 Dest의 값과 비교해서 맞을시에는"\nCongratulations! Please send an e-mail"..라는 성공문구가 뜨게됩니다.

 (반대로 , 키값이 다를경우는 우리가 처음에 보았던 sorry 문구가 나오게됩니다 ) 

    .text:690010D4                 jnz     short loc_690010F3 에서 확인 가능 


그래서 stricmp() 의 다음인 .text:690010CF에 break를 걸어주고 임의의 값을 넣어주게되면, 




반응형
,