CodeEngn Advance RCE L09 Write-Up
파일 링크: https://codeengn.com/challenges/
CodeEngn.com [코드엔진] - Challenges
코드엔진은 국내 리버스엔지니어링 정보공유를 위해 2007년 부터 리버스엔지니어링 컨퍼런스 및 비공개 워크숍을 현업 실무자들과 함께 운영하고 있습니다. 리버스엔지니어링이라는 하나의 큰 주제로 소프트웨어 보안에 대한 다양한 시각과 연구주제에 대한 정보공유를 추구하고 있으며, 상업적 이익 없이 작은 예산으로 운영하고 있어 큰 예산으로 운영하는 다른 컨퍼런스에 비해 여러 가지로 부족 할 수 있습니다.
codeengn.com
풀어보자.
파일을 실행하면 Username, Password 값을 입력 받는다. 문제에서 Password가 무엇인지 묻고 있는데 Username도 입력 받고 있다..?
code 섹션에서 우클릭 - Search for - All referenced strings 기능을 클릭하면 위와 같이 사용되는 문자열들을 확인할 수 있다. "Username: " 문자열이 사용되는 곳을 살펴보자.
"Username: " 문자열이 사용되는 곳을 보니 문자열을 출력하고 값을 입력받는다. 그리고 0x012913FF 주소의 0x01291000 함수가 호출되고 나면 "Sorry ~~" 문자열이 출력되므로 0x01291000 함수를 살펴봐야 한다.
0x01291000 함수를 보면 내가 입력한 Username의 값이 널문자인지를 검사한다. 널문자가 아니면 0x01291030 주소로 점프한다.
0x01291030 주소로 점프한 후 0x0129104B 주소의 CMP 명령어로 내가 입력한 Password 값과 0x88228F 값을 비교한다. 아마도 이 값이 올바른 Password 값일 것이다.
0x88228F 값을 10진수로 변환하여 입력했지만 실패한다.
Username 값이 널문자인지 검사하고 있고 코드엔진 문제가 Username을 요구하지 않기 때문에 입력한 Username 값을 널문자로 패치해봤다.
그럼 0x0129102C 주소로 점프하고 EAX 레지스터의 값을 0으로 초기화한다. 그리고 0x01291035 주소로 점프하여 입력한 Password를 검사한다. Username이 널문자가 아닐 때는 EAX 레지스터의 값이 SBB 명령어에 의해 0이 아니게 되고, EAX 레지스터의 값에 따라 성공/실패 메시지가 출력되는 것이다.
Username을 널문자로 만들어주면 성공한다.
Auth Key 값은 위 Password 값이다.
'Wargame > CodeEngn Advance RCE' 카테고리의 다른 글
CodeEngn Advance RCE L10 Write-Up (0) | 2019.09.09 |
---|---|
CodeEngn Advance RCE L08 Write-Up (0) | 2019.09.09 |
CodeEngn Advance RCE L07 Write-Up (0) | 2019.09.09 |
CodeEngn Advance RCE L06 Write-Up (0) | 2019.09.06 |
CodeEngn Advance RCE L05 Write-Up (0) | 2019.09.06 |