문제입니다.

"CodeEngn / 12345"를 넣고 실행한 화면입니다.

PEID로 확인해본 결과 아무 정보도 얻을 수 없었습니다.

먼저 안티디버깅 기법이 걸려있는지 확인해봤습니다.

break point를 설정하였습니다.

코드 실행중 함수를 만나게되면 우회할 용도입니다.

String 찾기를 통해 성공메시지를 찾아보았습니다.

더블클릭하여 들어가겠습니다.

들어간 화면입니다.

성공메시지 출력까지 총 3개의 검증 명령어가 있습니다.

1. 9E12AB : TEST BL, BL

2. 9E12AF : CMP BYTE PTR SS:[ESP+B], 0

3. 9E12BD : TEST AL, AL

첫번째 검증을 통과하기 위해 먼저 BL의 값이 어디서 생성되는지 위로 쭉 올라가보겠습니다.

19E1030에서 SBB EAX,EAX 부분은 뺄셈을 할 때 캐리도 같이 빼주는 역할을 합니다.이때 제로 플래그의 변동이 생기므로 이 부분을 건너 뛸수 있도록 9E102E를 거쳐가게 만들면 최종적으로 BL검증을 통과 할 수 있습니다.

우선 9E1048을 보면 "SETE BL"이라는 명령어가 보입니다. 이는 제로 플래그가 1이라면 BL을 1로 세팅하는 명령어입니다. 이후 "CMP EAX, DWORD PTR DS:[ECX]"를 하는데 이 부분이 패스워드를 비교하는 부분입니다.

EAX에는 제가 입력한 숫자 "12345"가 hex값으로 들어가있습니다.

이를 "0x88228F"와 비교하고 있으므로 이를 10진수로 바꾸면!

"8921743"이 패스워드가 됩니다.

이제 ID를 찾아보겠습니다.

"CodeEngn / 12345"를 입력했을 때 1331008부분에 제가 입력한 ID값이 보이는 것을 확인 할 수 있습니다.

1331012 부분의 CMP DL, BYTE PTR DS:[ECX]가 보이는데 DL에는 제가 입력한 값이 존재합니다.

첫글자를 0x00과 비교를 하고 있습니다.

첫글자를 0x00으로 시작해야 한다는 것을 확인했습니다.

첫글자를 0x00으로 만들어주고 이 부분을 진행하다보면 DL에는 0x00값이 들어가기 때문에 반복문을 탈출하게 됩니다.또한 9E1048 부분의 "SETE BL"을 점프하게 되므로 최종적으로 BL검증을 통과할 수 있습니다.

즉, 여기서는 첫글자가 0x00으로 시작하는지만 확인합니다.

조금 내려와보면 105105F 부터 ID를 비교하는 루틴이 시작됩니다.

분석을 해 보면 ID를 한글자씩 비교하여 "DonaldDuck"이 맞는지 확인하게 됩니다.

그럼 최종 ID는 "0x00DonaldDuck"이고 PW는 "8921743"가 됩니다.

이제 두번째 검증인 9E12AF : CMP BYTE PTR SS:[ESP+B], 0 이 부분을 통과하려면 [ESP+B]의 주소를 알아보겠습니다.

"0x24F873"입니다.

이 부분의 값이 만들어 지는 구간은 아래와 같습니다.

13E104B CMP EAX, DWORD PTR DS:[ECX] 즉, PASSWORD가 일치하면 제로플래그가 1이 되면서 [ESP+F]가 가르키는 주소에 1을 쓰게 됩니다. 주소를 자세히 보면 "0x24F837"으로 [ESP+B]와 동일한 주소입니다.

ID와 PW가 맞으면 자동으로 1,2 검증은 통과하게 됩니다.

마지막 검증을 보겠습니다.

1012B6을 보면 [1031C8]의 주소에는 항상 값이 존재하므로 TEST AL, AL 했을시 점프를 하지 않고 다음 코드를 실행하게 됩니다.

그럼 인증을 진행해 보겠습니다.

"0x00DonaldDuck / 8921743"

ID에 첫글자에 0x00을 넣기위해 아래와 같이 수정했습니다.

F9를 눌러 진행하면!

인증되었습니다.

Advance RCE L09 성공!

'WAR GAME > CodeEngn(Advance)' 카테고리의 다른 글

Advance RCE L10  (0) 2020.07.15
Advance RCE L08  (0) 2020.04.29
Advance RCE L07  (0) 2020.04.29
Advance RCE L06  (0) 2020.04.29
Advance RCE L05  (0) 2020.04.29

+ Recent posts