문제 파일을 다운받아보면 다음과 같이 실행 파일 하나를 줍니다.
이 파일을 exeinfope에 넣어보면 다음과 같이 나옵니다.
간략하게 보면 32비트 기반 실행파일이고 비주얼 C++로 작성된 프로그램이란것을 알수 있습니다.
별도의 패킹은 발견되지 않았습니다.
이제 프로그램을 실행시켜보고 전체적인 구조를 파악해봐야 합니다.
프로그램을 실행시키면 다음과 같이 값을 입력할수 있는 박스와 확인 버튼이 있는 구조인것을 알수 있습니다.
아무 값이나 입력해보면
다음과 같이 잘못된 비밀번호라는 메세지가 나옵니다.
지금까지 파악한 구조를 기반으로 분석을 진행해 보겠습니다.
IDA 를 통해서 분석을 진행할것인데, 먼저 아까전에 확인해본 바로는
비밀번호가 틀렸을때 Incorrect Password라는 문자열이 메세지박스로 출력되었습니다.
그렇다는것은, 이 문자열이 쓰인 로직을 따라가다보면 비밀번호를 판별하는 로직을 찾을수 있다는것입니다.
그러므로 이 문자열이 쓰인 곳을 먼저 찾아보면
다음과 같이 아까전에 봤었던 문자열과 Congratulation !!이라는 문자열이 보입니다.
이 문자열이 쓰인 곳을 확인해보면
다음과 같이 어떤 함수에서 쓰였는지 확인할수 있습니다.
이 함수로 이동해보면
대략 다음과 같은 구조를 하고있는 로직이 나옵니다.
먼저 첫번째 부분부터 살펴보면 프로시저가 호출된뒤에 스택의 공간을 확보하고
GetDlgItemTextA 함수를 호출하는것을 봤을때
제가 입력한 임의의 값을 입력받는 부분으로 보입니다.
실제로 1111을 입력한뒤 스택을 확인해보면
다음과 같이 입력한 값이 아스키코드로 스택에 푸쉬되어 있다는것을 알수 있습니다.
그 뒤에있는 분기문 부분을 보면 'a'와 esp+0x68+var_63 에 있는 값과 비교했을때
값이 다르다면 바로 비밀번호가 틀렸다는 메세지박스를 출력시키도록 하고
같다면 다음 로직으로 넘어갑니다.
그런데 esp+0x68+var_63 값을 확인해보면, 입력했던 값의 2번째 자리입니다.
이것을 통해서 비밀번호의 2번째 자리는 a 라는것을 알수있습니다.
그러므로 비밀번호를 1a11로 바꿔서 다시 실행하겠습니다.
그다음 로직을 살펴보면, 5y라는 문자열과 입력한 값을 비교하는것으로 보입니다.
strncmp함수를 호출할때 2가 스택에 푸쉬된것으로 봐서 입력값의 2자리만 비교하는것으로 보이는데
Str2와 비교되는 ecx 값을 살펴보면
3번째 자리부터 2자리가 비교할 문자열인것을 알수 있습니다.
그러므로 이 로직을 통과하기 위해서는 3,4번째 문자가 5y여야 한다는것을 알수 있습니다.
일단 지금까지 알아낸 정보를통해서 유추해봤을때 비밀번호는
Xa5yXXX~ 와같은 형태일것으로 추측해볼수 있습니다.
그러므로 비밀번호를 1a5y11111111111 로 바꿔서 입력한뒤 분석을 진행하겠습니다.
그 다음 로직을 살펴보면 다음과 같습니다.
로직이 조금 복잡해졌으므로 천천히 분석해봐야 합니다.
esi에는 R3versing 이라는 문자열의 주소가 있고, esp+0x70+var_60 의 주소에는 1a5y11111111111 에서
y뒤에있는 1의 주소입니다.
그 뒤에 eax의 첫번째값과 esi의 첫번째 값을 비교하고 만약 같다면 각각의 레지스터에서
한자리 뒤에있는 값을 서로 비교해서 그 값들도 같다면 eax와 esi에 2씩 더해서 비교 루틴에 루프를 돌리는
방식이므로, 문자열끼리 서로 한자리씩 비교하는 로직이라는것을 알수 있습니다.
그러므로 비밀번호의 형태는 Xa5yR3versing 과 같다고 유추할수 있습니다.
1a5yR3versing 을 다시 입력해서 분석해보면 이 검사 로직을 통과했으므로 저의 분석이 맞았다는것을 알수 있습니다.
이제 마지막 분기를 나누는 로직만 남았습니다.
이 부분을 보면 esp+0x68+String 과 'E' 를 비교해서 서로 같다면 성공 메세지박스를 출력하고
다르다면 실패 메세지박스를 출력한다는것을 알수 있습니다.
esp+0x68+String 를 확인해보면
입력값의 첫번째 값이라는것을 알수 있습니다.
그러므로 첫번째 값은 E라는것을 알수있고, 최종적으로 이 프로그램의 비밀번호는
Ea5yR3versing 입니다.
이 비밀번호를 입력하면 성공 메세지박스가 출력되는것을 확인할수 있습니다.
'워게임 > Reversing.kr' 카테고리의 다른 글
[Reversing.kr] ImagePrc 풀이 (0) | 2022.07.02 |
---|---|
[Reversing.kr] Replace 풀이 (0) | 2022.06.30 |
[Reversing.kr] Music Player 풀이 (0) | 2022.06.29 |
[Reversing.kr] Easy Unpack 풀이 (0) | 2022.06.29 |
[Reversing.kr] Easy Keygen 풀이 (0) | 2022.06.29 |