히공

코드엔진 - basic 15 본문

reverse engineering/CodeEngn

코드엔진 - basic 15

heegong 2020. 10. 4. 21:08
728x90

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

이러한 문제입니다.

 

 

 

 

 

name, serial을 입력하고 Check it ! 을 누르면 정답인지 아닌지 확인합니다.

 

 

 

 

 

이런식으로 확인합니다.

 

 

 

 

패킹은 안되어있습니다.

 

 

 

 

 

x32dbg에서 실패했을때 나왔던 Try Again으로 검색해보았습니다.

 

 

 

 

 

 

이런 코드를 발견했습니다.

 

 

 

 

 

bp가 있는곳이 분기점 입니다.

한번

Name에 CodeEngn,

비번에는 1234를 넣고 f9를 눌러서 eax값과 45B844의 값을 확인해보겠습니다.

 

 

 

 

 

eax값 입니다. 제가 입력했던 비밀번호 입니다.

 

 

 

 

 

 

덤프 따라가기로 45B844의 값을 확인해보겠습니다. (dword ptr 로 받아오니 4바이트만 비교합니다.)

0x6160 입니다. (리틀엔디안이기 때문에 반대로 봐야합니다.)

0x6160은 10진수로

24928입니다.

 

 

 

 

 

성공입니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

++

루틴분석을 해보겠습니다.

똑같이 Try Again 으로 넘어와서 (Name : CodeEngn, Serial : 1234를 입력한상태)

call 458760을 실행해보았습니다.

 

 

한번 458760 함수 내부를 분석해보겠습니다.

재시작을 해줍니다.

 

 

 

 

 

 

여기서 f7을 눌러서 함수 내부로 진입합니다.

 

 

 

call 403A64까지 실행했더니 eax가 8이 되었습니다. strlen(입력한 네임) 을 한것 같습니다.

이 for문을 분석해보니

 

 

1
2
3
4
5
6
7
8
ebx = 0
for i in range(len(입력한 네임)):
    edx = 입력한 네임
    ecx = i
    edx = edx[i]
    edx = edx << 3
    ebx += edx
 
 

였습니다.   (   [ebx] = 0x45B844 )

 

이 for문이 끝나고

 

 

 (여기서도 [ebx] = 0x45B844 입니다.              [edi]는 입력한 네임 입니다.)

 

이 부분을 윗 코드와 합쳐서 표현한다면 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ebx = 0
for i in range(len(입력한 네임)):
    edx = 입력한 네임
    ecx = i
    edx = edx[i]
    edx = edx << 3
    ebx += edx
 
eax = len(입력한 네임) << 3
ebx += eax
eax = ebx
eax = eax << 2
ebx = eax
 
 

이런식으로 표현이 됩니다.

 

이거를 예쁘게 정리해서 파이썬 코드로 변경해보겠습니다.

 

 

 

 

 

 

이것입니다.

 

 

 

제대로 출력됩니다.

 

 

 

 

 

 

 

정답 : 24928

'reverse engineering > CodeEngn' 카테고리의 다른 글

코드엔진 - basic 17  (2) 2020.10.10
코드엔진 - basic 16  (0) 2020.10.05
코드엔진 - basic 14  (0) 2020.09.25
코드엔진 - basic 13  (0) 2020.09.25
코드엔진 - basic 12  (1) 2020.09.22
Comments