아메바시큐리티

[Basic RCE] 14번 본문

리버싱/codeengn

[Basic RCE] 14번

am2ba 2021. 5. 17. 19:17

문제

Name이 CodeEngn 일때 Serial을 구하시오
(이 문제는 정답이 여러개 나올 수 있는 문제이며 5개의 숫자로 되어있는 정답을 찾아야함, bruteforce 필요)
Ex) 11111

풀이.

먼저 Windbg32를 이용해 해당 문제 파일을 열어보자. 

파일을 열어보니, 엄청나게 많은 jne, jb, jae 등과 같은 jump 관련 명령어가 많은 것을 알 수 있다. 이와 같은 파일들은 주로 packing이 되어 있는 경우가 많다. unpacking을 진행해보자.

upx unpacker를 이용해서 unpack한 결과, unpack이 되었다. 

unpack한 파일을 다시 windbg로 열어보자.

내용을 살펴보던중, Serial 번호를 확인하는 분기문의 위치를 확인할 수 있었다. 해당 분기분을 보면, esi와 eax를 비교하여 같을 때, Good Job 메시지를 띄우는 것을 확인할 수 있다.

또한 해당 분기문 위쪽에 

call 14.0401383 을 통해 함수를 호출하는데,  함수의 return 값은 eax에 저장되므로...

14.401383의 return 값과 esi의 값을 비교하는 것을 확인할 수 있다 .

또한 바로 위쪽에서 입력받은 문자열을 처리하는 루프를 수행하고, 루프가 종료되면 esi의 값과 14.403138을 stack에 push하는 것을 발견할 수 있다. 

이를 통해, esi의 값은 문자열을 통해 얻어지는 값 즉, 우리가 구해야할 serial 과 관련이 있는 것을 알 수 있다. 

 

우선 이름에 codengn을 넣고, serial number에 0000을 넣은 다음 디버깅을 진행해보자.

해당 함수의 return 값이 0인 것을 알 수 있었다. 

0을 넣었을 때 0이 나온다? 그러면 이번에 1을 넣어보자. 

1을 넣었을 때는 값이 1이 나온다. 

숫자를 그대로 표현하는 걸까? 이번엔 알파벳 a를 넣어보자. 

a를 넣으니 31이 나왔다. 음... b를 넣으면 32가 나오려나?

32가 나왔다. 그러면 이제 ab를 넣어보자. 

ab를 넣은 결과에서는 21C가 나왔다. 음 잘모르겠다. 1234를 넣어보자.

4D2...? 

이것을 통해 숫자를 넣으면 해당 숫자의 HEX변경 값이 EAX에 들어간다는 것을 알 수 있었다. 영어는 잘 모르겠다. 

우리는 EAX와 ESI의 값을 비교해서 같게 해야하기 때문에 ESI의 값을 확인해보자. 

입력값이 codeengn일 때 ESI의 값은 15381이 된다. 

EAX가 15381이 되기 위해서는 16진수로 15381에 해당하는 10진수 수를 넣어주면 될것 같다.

86913을 시리얼 넘버로 해보자. 

시리얼 넘버가 맞다고 한다. 

정답 : 86913

근데 codeengn이 아니라 CodeEngn이라고 한다.... CodeEngn을 입력한 후 다시  구해보면... 

정답 : 76193

'리버싱 > codeengn' 카테고리의 다른 글

[Basic RCE 1]  (0) 2021.04.30