1. 문제 파일 실행
문제 파일 실행 시 Key를 입력하는 메세지 창 실행됨
About 버튼 클릭 시 올바른 키를 찾으라는 안내문이 나옴
잘못된 키 입력하면 Check를 눌러도 아무 반응 없음
2. 문제 파일 패킹 여부 확인
PEiD로 확인 결과 EP Section이 .text로 나오는 것으로 보아 패킹되지 않은 실행파일이다.
3. Key 값 찾기
immnunity debugger로 문제 파일을 연 후 key값을 먼저 찾기로 했다.
문제를 통해 올바른 key값을 입력한 경우 성공메시지가 출력됨을 알 수 있기 때문에 해당 위치 근처를 살펴보기로 했다.
immnunity debugger로 문제 파일을 연 후 마우스 우클릭 > Search for > All referenced text strings로 파일에 포함된 문자열을 확인한 결과 성공 시 출력될 것으로 보이는 Congratulations, ~ 을 찾을 수 있다.
해당 위치로 이동하기 위해 왼쪽 address영역을 더블클릭한다.
성공 메시지 박스 출력 전 사용자 입력값과 key값을 비교하는 연산(CMP)이 있을 것이다.
위쪽 빨간 박스 안을 보면 EAX 값과 7A2896BF를 비교해 일치하면 MessageBoxA 함수 실행 직후 주소로 이동하는 것을 볼 수 있다.
따라서 7A2896BF가 key 값일 가능성 있음
CMP 연산은 두개 비교 결과 같으면 1, 다르면 0 반환
JNZ : NOT ZERO 인 경우 JUMP, ZERO인 경우 점프하지 않고 다음 명령 실행
=> CMP 후 JNZ = 비교값이 같으면 JNZ 주소로 점프
7A2896BF는 16진수이므로 계산기를 이용해 10진수로 변환하고
입력 영역에 이 값을 넣고 check를 누르면 추정한 key가 맞음을 확인할 수 있다.
key : 2049480383
4. 주소영역 찾기
문자열의 주소 영역을 찾기 위해 문제 파일을 HxD로 열어 성공 메시지가 위치하는 부분을 확인한다.
위 블록 처리된 부분을 KEY 값으로 덮어쓰면 되는 것이다.
HxD에서는 클릭하고 키보드로 입력해서 바로 값을 바꿀 수 있다.
위에서 찾은 KEY값을 넣어주고 나머지 영역은 NULL값(00)을 넣어준다.
KEY 값이 Overwrite 된 영역의 주소는 0x0D3B~ 0x0D45이다.
Overwrite 된 영역의 주소의 마지막이 0x0D44가 아닌 이유는 문자열은 끝에 NULL이 있어야 해당 문자열이 끝났음을 알 수 있기 때문에 마지막 NULL 값 하나를 포함하기 때문이다.
수정한 파일을 다른이름으로 저장하고, 실행 후 KEY 값을 넣었더니 기존 성공 메시지 대신 KEY값이 출력된다.
FLAG 구성은 Key값 + 주소영역이므로, 2049480383 + 0d3b~0d45이다.
FLAG : 20494803830d3b0d45
Strings 분석, CMP와 JUMP 관련 연산 과정 추론, HexEdit를 통한 hex값 조작을 통해 풀 수 있는 문제였다.
'해킹 공부 > 리버싱' 카테고리의 다른 글
CodeEngn_Basic RCE L14 (strings, CMP, EAX/ESI값) (0) | 2022.11.15 |
---|---|
CodeEngn_Basic RCE L13 (C# 디컴파일) (0) | 2022.11.10 |
CodeEngn_Basic RCE L11 (OEP, stolenbyte) (0) | 2022.11.06 |
CodeEngn_Basic RCE L06 (OEP, unpacking, strings) (0) | 2022.10.09 |
CodeEngn_Basic RCE L03 (0) | 2022.09.25 |