CodeEngn Basic - (6)
이번 단계에서는 OEP(실제 시작 지점)과 시리얼 키를 찾아야 합니다.
일단 다운받습니다.
실행을 한번 시켜보면
이렇게 시리얼 키를 입력하지 않으면 오류창이 뜹니다.
저번 문제처럼 UPX패킹이 돼있을 수도 있으니 까봅니다.
UPX패킹이 돼있습니다. 언패킹 해줍시다.
잘되었는지 확인해봅니다.
보아하니 이 실행파일은 C++로 코딩돼있는 것을 확인할 수 있습니다.
올리디버거로 열어봅니다.
Wrong 메시지를 찾기 위해 문자열을 뽑습니다.
Wrong메시지가 보입니다. 더블클릭으로 들어가줍니다.
보다보면 성공창과 에러창이 있습니다.
TEST EAX,EAX – 두 값을 AND 연산하였을 때 0이 나오면 ZF를 1로 설정하고 연산 값이 1이면 ZF를 0으로 설정합니다.
두 연산값이 0이기 때문에 에러창이 뜬다는 걸 알 수 있습니다.
EAX가 지금 1인데 연산 값은 1이 나올 수 밖에 없습니다. 저흰 이 EAX를 0으로 바꾸어주어야합니다. ASCII쪽만 봐도 0040173주소의 함수가 수상한 것을 알 수 있습니다. 들어가 봅니다.
이 코드를 요약해보자면 EDX와 ECX에 어떠한 값이 들어갑니다. ->
EDX와 3을 AND연산합니다. -> ZF가 0이면 점프하지 않습니다. ->
EAX에 어떠한 값을 넣습니다. -> AL과 ECX를 비교합니다. ->
ZF가 0이면 점프하지 않습니다. -> AH와 ECX+1와 비교해서 ZF가 0이면 점프하지 않습니다. -> AL과 ECX+2와 비교해서 ZF가 0이면 점프하지 않습니다. -> AH와 ECX+3과 비교해서 ZF가 0이면 점프하지 않습니다. -> 결국 EAX는 0이 됩니다.
간단하게 정리하자면 EDX와 ECX만 주목하면 됩니다.
답은 나왔군요. ECX는 저희가 넣었던 시리얼 키고 EDX는 원래 시리얼 키입니다. AD46DFS547를 넣어주면 됩니다. 그러면 성공 창이 뜨게 됩니다. OEP는 프로그램이 처음 시작되는 주소인데 패킹도 풀었고 파일의 시작주소를 보면 됩니다. 시작주소는 00401360입니다.