Code Enigne Basic 10
OEP를 구한 후 성공 창으로 가는 OPCODE를 찾는 것이 이번 문제입니다. 일단 다운로드를 받고 파일을 실행시켜 봅시다.
실행시켜보면 위와 같은 창이 뜹니다. 그러나 입력창에 아무것도 입력이 되지 않습니다. 우선 올리디버거로 열어봅시다.
실행화면이 아까와는 달라졌습니다. 일단 OEP를 찾아보면
프로그램에 브레이크를 걸고 계속 실행을 했는데도 실행이 됩니다. 게다가 프로그램조차 실행이 되지 않습니다. 심지어 브레이크를 걸고 다시 실행시켰더니 브레이크가 없어지기까지 합니다.
아까부터 프로그램을 열 때마다 계속 이 창이 뜹니다. 아마도 이 파일은 패킹되어 있을 확률이 매우 높습니다. 패킹이란 쉽게 말하면 압축입니다. 그냥 압축이 아니라 실행파일을 압축하는 것이지요.
패킹은 용량을 줄이고 보호 목적으로 암호화를 시키기 때문에 매우 복잡합니다.
코드의 가장 첫 번째에 PUSHAD라고 나와 있습니다. 즉 패킹 되어있다는 것을 알려줍니다. 그런데 PUSHAD로 패킹되어있는 프로그램은 대부분 POPAD로 패킹을 풀 수 있습니다. (지금까지 UPX로 언패킹 했는데...)
POPAD를 찾아봅시다.
오른쪽 마우스 -> Search for -> All commands -> POPAD를 입력합니다.
입력한 후 Find를 누르면
정말 많은 양의 POPAD가 검색됩니다. 우선 첫 번째 것을 더블클릭 해봅시다.
조그만 움직이니 바뀌어 버리는 것으로 보아 아닌 것 같습니다. 그럼 두 번째를 더블클릭 해봅시다.
POPAD부터 브레이크를 걸고 실행시켜 봅시다.
이 사진은 실행시키기 전
이 사진은 실행시키고 난 후입니다. 차이점을 보이나요?
밑에서 두 번째 줄을 보게 되면 PUSH가 있습니다.
실행 전에는 PUSH 0 이었지만 실행을 시키는 PUSH 10.00445834로 바뀝니다.
00445834가 스택에 입력된 것을 확인 할 수 있습니다.
계속 실행시키다 보면 retn함수가 실행된 후 프로그램이 실행됩니다.
가장 최근에 스택에 입력한 00445834가 시작주소 즉 OEP임을 알 수 있습니다.
이제 OPCODE만 찾으면 됩니다.
코드를 찾다 보면 성공창이 있습니다. 더블클릭해서 들어가 보면
여기서 OPCODE를 찾아야 합니다. 찾다보면 성공 창에서 제일 가까운 점프 JNZ short 10,0044552B라고 적혀있습니다.
저 점프는 10과 0044552B의 값을 비교했을 때 ZF가 1이면 점프하고 ZF가 0이면 점프하지 않습니다.
0040552B에 있는 값이 10이 아니기 때문에 Zero flag의 값은 0을 반환하고 JNZ는 점프를 하지 않고 넘어가 성공 문을 출력할 것입니다. OPCODE는 JNZ가 되는것이지요.
OEP+OPCODE가 정답이므로 정답은 00445834004454D4가 됩니다.