반응형
반응형

 

03.exe
2.03MB

 

 


분석 1

 

 

어셈블리어로 만들어진 프로그램이다.

 

패킹은 안되어 있다.

 

 

프로그램을 실행하면 위와 같이 Name... 문자열과 Serial... 문자열이 나온다.

 

 

Check 버튼을 누르면 "No, that is not the right answer :)" 메시지 창이 뜬다.

 

 

About 버튼을 누르면 위와 같이 뜬다.

 


분석 2

 

 

x32dbg에 프로그램을 열어 문자열 검색을 보면 위와 같이 문자열들이 뜬다.

 

 

"You failed..." 문자열을 40112A 주소와 40119E 주소 두 곳에서 참조하는데 두 곳 모두 BP를 건다.

 

 

- 위의 코드를 보면 401120 주소에서 GetDlgItemTextA() 함수를 호출하고, eax가 3이랑 같은지 비교하고 3이상이면 401142 주소로 점프한다.

(이 부분은 Name의 글자가 3글자 이상 적혔는지 검사하는 곳이다.)

 

- Name 값을 이용하여 Serial 키를 만드는 부분은 40114E 주소에서 호출하는 401277 주소의 함수 인 것 같다.

 

- 401162 주소에서 GetDlgItemTextA() 함수를 다시 한 번 호출하는데, 이 부분은 Serial 값을 가져오는 부분이다.

 

- Name의 값을 가져와 Serial 키를 생성하고 사용자가 입력한 Serial 값을 가져온 뒤 401177 주소에서 wsprintfA() 함수로 403000 주소에 있는 Serial 키를 403284 주소에 복사한다.

 

- 그리고 401196 주소에서 lstrcmpA() 함수로 입력한 Serial 값과 생성된 Serial 키를 비교한다.

 

 

그 후 cdq 명령어와 idiv 명령어가 나오는데

idiv는 나눗셈을 하는 명령어이고, 피제수(나눔을 당하는 수)는 eax나 edx 레지스터에만 들어갈 수 있다고 한다.

일반적으로 제수(나누는 수)가 32bit이면, 피제수(나눠지는 수)는 64bit여야 나누었을 때 32bit의 몫을 가질 수 있다.

 

그렇기에 cdq를 이용해 32bit 피제수인 eax를 64bit인 edx:eax 형태로 확장시켜 eax에 있는 데이터를 edx:eax에 저장하는 것이다.

 

idiv는 부호가 있는 나눗셈 연산을 수행하고, div가 부호가 없는 나눗셈 연산을 수행하는데

위의 경우 부호가 있는 나눗셈 연산을 수행하고, edx가 상위자리 eax가 하위자리이며, 나눗셈이 완료되면 edx에 나머지가 eax에 몫이 들어가게 된다.

 

즉, 위의 코드에 대입해보면 cdq를 이용해 eax를 edx:eax 형태로 32bit에서 64bit로  확장하고, idiv를 이용해 EDX:EAX를 EAX로 나눈 후 몫은 EAX에 나머지는 EDX에 저장한다.

 

 

Serial 값이 일치하지 않으면 lstrcmpA() 함수의 결과로 eax에 0이 아닌 값이 담기고, cdq와 idiv 명령어의 결과로 eax에는 1이 담기며 실패했다는 메시지가 뜨는데

 

 

Serial 값이 일치하면 lstrcmpA() 함수의 결과로 eax에 0이 담기고, cdq와 idiv 명령어로 0을 0으로 나누니 결과로 eax에는 0이 담기고 0을 0으로 나눴으니 예외가 발생하여 위의 77384FE0 주소로 간 뒤

 

 

401398 주소로 가 성공했다는 메시지 창을 띄우는 부분으로 간다.

(컴퓨터에서 0을 0으로 나누면 에러가 발생한다.)

 

 


풀이

 

 

위와 같이 lstrcmpA() 함수를 호출하는 401196 주소에 BP를 걸고 F9 키를 눌러 프로그램을 실행한다.

 

 

Name에는 CodeEngn을 넣주고, Serial에는 아무 값이나 적어준다.

 

 

그러면 401196 주소에서 멈추게 되고 12341234와 Name의 값으로부터 생성된 Serial 값 3265754874를 비교하는 걸 확인할 수 있다.

 

 

Name에 CodeEngn / Serial에 3265754874를 입력하면 성공 메시지 창이 뜬다.

 


인증

 

https://ch.codeengn.com/auth

 

위와 같이 입력한다.

 


cdq와 idiv : https://clansim.tistory.com/31

 

idiv : https://live2skull.tistory.com/18

 

cdq : https://m.blog.naver.com/zxwnstn/221515952602

반응형

'전쟁 > codeengn' 카테고리의 다른 글

[codeengn] Advance RCE 05  (0) 2022.10.20
[codeengn] Advance RCE 04  (0) 2022.10.20
[codeengn] Advance RCE 02  (0) 2022.10.19
[codeengn] Advance RCE 01  (0) 2022.10.19
[codeengn] Basic RCE 20  (0) 2022.10.17

+ Recent posts