본문 바로가기

Hacking/Reversing

CodeEngn_basic_6

Basic RCE L06

 

Unpack을 한 후 Serial을 찾으시오.
정답인증은 OEP + Serial
Ex) 00400000PASSWORD


이번 문제는 upx패킹이 되어있었기 때문에 upx언패킹을 진행한 뒤에 실행시켰다.

실행시켜봤을 때 다음과 같은 화면이 출력된다.

 

 

아무 값이나 입력했을 때에는 에러 메세지를 출력시킬 뿐 아무 일도 일어나지 않았다.

 


 

일단 문제를 풀기에 앞서 OEPOriginal Entry Point의 약자로 언패킹된 프로그램의 실제 시작주소를 뜻한다.

우리가 알아야 할것에 대해서도 알아보았으니 이제 디버깅을 시작해보자

OEP를 가장먼저 찾을 건데 이건 찾을 필요도 없다. 왜냐하면 디버거에 프로그램을 넣으면 맨 처음부분으로 가기 때문이다.

 

이번 문제같은 경우 함수의 PUSH EBP부분이 시작이다. 여기의 주소부분을 사용하면 된다.

 

OEP는 간단하게 찾았으니 이번에는 PASSWORD를 찾아야한다.

가장 먼저 봐야할 부분은 text들이 저장되어 있는 text string부분이다, 아마 이곳에 에러메세지나 성공했을 때의 text가 저장되어있을 것이다.

 

Good Job이 클리어메세지인듯 하니 이 부분으로 들어가보자

 

 

이동 후 조금만 위로 올려보니 점프문인 JNZ부분이 보였다 아마 이 윗쪽이 Serial값을 비교해서 값을 return해주는 것인듯 하다.

 

 

JNZ는 JumpNot Zero라는 말로 ZeroFlag라는 부분의 값을 확인하는데 ZeroFlag의 값이  0이 아니라면 점프를 시켜준다.

TEST는 묵시적으로 and연산을 해준다. operand1하고 operand2를 비교해주는데 둘다 같으면 1을 그렇지 않으면 0을 ZeroFlag에 반환한다.

 

여기서부터 약간 갈리는데 그냥 간단히 생각해서 저 TEST라는 비교 부분에 break를 걸고 레지스터에 들어간 값을 보면 대강 답은 유추할 수 있다.

하지만 그렇게 하면 재미가 없으니 코드를 해석해보기로 했다.

 

우리는 EAX값을 0으로 만들어주어야 한다. 하지만 TEST에서는 1을 반환했으니 TEST는 볼 필요가 없을 듯 하다.

우선 EAX는 함수가 끝났을때 return값으로 들어가는 부분이다 그런데 TEST에서 조금 위쪽에 우리 어떤 함수를 하나 call하고 있는 걸 볼 수 있는데 여기로 들어가서 디버깅을 진행해보자.

 

 

해당 함수를 클릭한 뒤에 Enter를 눌러 함수 내부로 들어와보니 위와 같은 화면이 나왔다.

EDX와 ECX에 우리가 입력한 값과 비교하는 값이 들어갔을 것이다. 

 

우선 저 아래에 보이는 JMP문들을 다 통과해야하는 것 같은데 살짝 해석해보기로 했다.

 

1.  EDX가 3과 같으면 점프시킨다.

2.  AL과 ECX를 비교해서 같지 않으면 점프한다.

- AL은 32bit인 EAX의 절반인 16bit AX의 또 절반의 오른쪽부분을 지칭한다. 여기서는 Little endian방식을 사용하기 때문에 여기서의 AL은 맨오른쪽의 두칸 00 이다. 

 

 

3.  AH 부분과 ECX+1부분을 비교한뒤 같지 않으면 점프한다.   // 문자열비교

4.  SHR ( 오른쪽으로 시프트연산을 진행한다 ) 시프트연산 오른쪽으로 10번 진행 // 여기에서 EAX를 0으로 조정해주는 것 같다.

5.  AH 부분과 ECX+2부분을 비교한뒤 같지 않으면 점프한다.  // 문자열비교

6.  AH 부분과 ECX+3부분을 비교한뒤 같지 않으면 점프한다.  // 문자열비교

7. 각각 ECX, EDX에 4씩 더한다.

8.  조건에 맞지 않으면 반복한다.

 

내가 할수 있는만큼 해석을 해봤는데 역시 아직은 미숙한 것 같다.

 

대충 이렇게 진행되는데 처음(TEST비교문 부분)에 비교할 text를 레지스터에 할당해주니 그 부분을 보면 어떤게 정답인지 알 수 있을 것이다. 

 

 

내 입력값이 ECX에 할당됨 그럼 나머지 EDX에 할당된 텍스트가 정답이다.

'Hacking > Reversing' 카테고리의 다른 글

CodeEngn_basic_8  (0) 2020.06.14
CodeEngn_basic_7  (0) 2020.06.14
CodeEngn_basic_5  (0) 2020.06.09
CodeEngn_basic_4  (0) 2020.06.07
CodeEngn_basic_3  (0) 2020.06.07