reverse engineering/CodeEngn

코드엔진 - basic 16

heegong 2020. 10. 5. 22:40
728x90

16번 문제를 풀어보겠습니다.

 

 

 

 

 

 

문제들이 비슷비슷 합니다.

 

 

 

 

 

 

 

 

 

 

실행화면 입니다.

 

 

 

 

 

 

 

 

 

틀리면 Wrong password! 가 출력됩니다.

 

 

 

 

 

 

 

 

 

메인함수 입니다.

 

 

 

 

 

 

 

 

 

 

 

 

이 부분이 Name을 입력받아서 어떠한 값을 생성하는것 같습니다.

 

 

 

 

 

 

 

 

 

 

이곳이 분기점 입니다.

 

 

 

 

 

 

 

bp를 걸고 name에 CodeEngn을 입력하고 비번에 1234를 입력해 보았습니다.

 

cmp로 eax와 [ebp-3c]를 비교합니다.

eax값을 확인해보겠습니다.

 

 

 

 

 

 

 

1234 제가 입력한 페스워드 입니다.

 

 

그러면 [ebp-3c]를 확인해보겠습니다.

 

 

 

 

 

 

0xE4C60D97 입니다. (리틀엔디안)

 

 

 

 

 

10진수로 3838184855입니다.

 

 

 

 

 

 

정답입니다.

 

 

 

 

++

비번값이 어떠한 방식으로 생성되는지 확인해보겠습니다.

 

 

 

 

 

 

 

 

 

이곳에 bp를 걸고     (jbe부터 401535까지는 strlen을 호출해서 esp에 입력한 네임값을 복사하는겁니다.)

 

 

 

 

 

 

 

 

다시한번 CodeEngn를 입력해봅시다.

 

 

 

 

 

 

 

 

그러면 eax에 8이 들어갑니다. call 412430를 하는데 저거는 strlen을 호출하는 겁니다.

 

 

 

 

 

 

 

 

중요 부분

그리고 그 값을 [ebp-20]에 넣습니다.

edx에 [ebp-20]을 넣습니다.

eax에 edx를 넣습니다.

eax에 eax를 더합니다.

eax에 edx를 더합니다.

eax에 shl 연산을 2만큼 합니다. (<< 연산)

[ebp-3c]에 eax를 넣습니다.

eax에 [ebp-3c]를 넣습니다.

eax에 eax*[ebp-3c]를 넣습니다.

eax에 eax*[ebp-3c]를 넣습니다.

eax에 0x17을 더합니다.

[ebp-3c]에 eax값을 넣습니다.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
ebp_20 = eax #네임의 길이
edx = ebp_20
eax = edx
eax += eax
eax += edx
eax = eax << 2
ebp_3c = eax
eax = ebp_3c
eax = eax*ebp_3c
eax = eax*ebp_3c
eax += 0x17
ebp_3c = eax
 

파이썬 코드로 작성한 모습입니다.

이걸 이쁘게 바꾸어 보겠습니다.

 

 

 

1
2
3
4
5
ebp_20 = eax #네임의 길이
eax *= 3
eax = eax << 2
ebp_3c = eax**3
ebp_3c += 0x17
 

이런식으로 바뀝니다.

 

 

 

 

 

그 다음 부분을 분석해보겠습니다.

 

 

여기는 비번을 입력하고 나서 분기하기 전입니다.

 

 

 

 

 

중요 부분

eax에 [ebp-3c]를 넣습니다.     (아까 계속 사용한 ebp-3c입니다.)

edx에 eax * 0xace80을 넣습니다.

eax에 [ebp-3c]의 주소를 넣습니다.

eax주소 안에 있는 값에 edx를 더합니다.       (한마디로 역참조값에 edx를 더합니다.)

그리고 페스워드 (   [ebp-40]하고 비교합니다.)

 

 

 

 

 

이걸 파이썬 코드로 표현해보겠습니다.

 

 

 

1
2
3
eax = ebp_3c
edx = eax * 0xace80
eax += edx
 

이것입니다.

 

 

이제 위에 코드랑 합쳐보겠습니다.

 

 

 

 

 

 

이것 입니다.           

(hex함수는 16진수로 바꿔주는 역할입니다. [4:]를 쓴이유는 4바이트로 맞춰주기 위해서 입니다.

int(edx, 16)에서 16은 16진수라는 의미입니다.)

 

 

 

 

 

 

출력 잘됩니다.

 

 

 

 

 

 

 

 

 

 

정답 : 3838184855

댓글수0