2020. 11. 23. 19:25ㆍ문제연습/CodeEngn (REC)
본 티스토리 블로그는 PC에 최적화되어 있습니다.
모바일 유저분들은 아래 네이버 블로그를 이용해 주세요.
이번 문제는 조금 고민이 많은 문제였습니다.
풀이가 불안정하므로 본문에 작성한 링크를 참고해주시길 바랍니다.
1. 문제 내용
StolenByte를 구하시오.
Ex) 75156A0068352040
Author: abex
File Password: codeengn
2. 문제해설
초기 실행 정보)
어떤 key 파일 정보를 확인하는 프로그램으로 추정되는군요.
일단 패킹 여부를 확인한 뒤 좀 더 세부적인 분석을 진행하도록 하겠습니다.
파일 정보)
upx 패킹이 확인되었으므로 패킹을 풀도록 하겠습니다.
패킹을 풀고 파일을 실행해 보니 이상 현상이 발생했습니다.
아까 처음 실행한 패킹 파일과 비교했을 때, 차이점은 오류 창이 발생한다는 점입니다.
올리 디버거로 확인하면 다음과 같습니다.
진입점으로 표시된 부분과 MessageBoxA 함수 인자 부분을 유심히 확인해보시길 바랍니다.
- StolenByte (아래 링크를 이용해 주시길 바랍니다.)
MessageBoxA 함수 인자는 hWnd, lpText, lpCaption, uType 이렇게 총 4개의 인자를 받아와야 합니다.
이들의 인자가 전달되지 않아 MessageBoxA 함수는 기본 값으로 출력하여 에러 창으로 표시된 것입니다.
StolenByte 기법은 oep 근처의 코드를 복사하여 다른 분리된 메모리에서 실행하기에, 이 과정을 모르고 그대로 덤프를 뜨면 위와 같이 일부 코드가 잘려나가는 문제가 발생합니다.
다시 말하자면 복사되는 코드를 우리가 확인하고 덤프 파일에 그대로 집어넣어 주면 정상 실행되지 않을까요????
다시 한번 패킹된 원본 실행파일을 올리 디버거에 넣어 보도록 하겠습니다.
(여기서부터는 upx 패킹에서 oep 찾는 방법에 대한 기본적인 이해가 필요합니다. 아래 링크 내용을 숙지해주시고 글을 읽어주세요.)
원본 패킹 파일을 다시 올리 디버거로 넣고 pushad, popad, jmp oep 부분을 찾은 화면입니다.
지금 jmp 부분에 중단점을 설정하고 f9을 눌러 실행하면 0x0040100C(oep) 주소에 우리가 원하는 정상적으로 패킹이 풀린(오류 없는) 코드들이 나올 겁니다.
또한, oep 주변에 이상한 코드들이 보이는데 이들은 MessageBoxA 함수의 인자로 보입니다.
주황색 부분은 함수의 인자 부분으로 의심되는 코드이며, 빨강 박스는 언 패킹한 파일에서 없었던 인자 부분으로 추측한 부분입니다.
한번 oep 주소로 넘어가서 확인해 보도록 하겠습니다.
네, 추측한 내용이 맞는 듯합니다.
즉, oep 이전에 존재하는 코드들과 언 패킹한 파일의 사라진 코드 부분의 용량을 계산해 봅시다.
61 6a 00 68 00 20 40 00 60 12 20 40 00 : 총 12 바이트
90*12 : 총 12 바이트.
따라서 StolenByte 크기는 12바이트입니다.
만약 손상을 복구하고 싶다면 위 NOP에 아까 찾은 코드를 붙여 넣어 주거나,
또는 패킹 파일의 oep 주소(0x0040100c) - 0xC(12바이트)를 뺀 주소로 점프하도록 코드를 수정한 뒤, 수정된 oep로 점프하는 부분부터 덤프를 뜨면 됩니다.
정확한 방식은 아래 링크를 이용해 주세요.
이상 풀이를 마칩니다!!!
'문제연습 > CodeEngn (REC)' 카테고리의 다른 글
Basic RCE L012 - 코드 엔진 (0) | 2020.12.05 |
---|---|
Basic RCE L010 - 코드 엔진 (0) | 2020.11.30 |
Basic RCE L07 - 코드 엔진 (0) | 2020.11.17 |
Basic RCE L06 - 코드 엔진 (0) | 2020.03.19 |
Basic RCE L05 - 코드 엔진 (0) | 2020.03.18 |