Beginner: rev-basic-0

리버싱의 첫 문제다.

주어진 PE 파일을 실행하면 문자열을 입력 받는다. 입력받은 문자열을 내부에 저장된 문자열과 비교하여 true이면 “Correct”를, false이면 “Wrong”를 출력한다. 그리고 내부에 저장된 문자열이 이번 문제의 플래그가 되겠다.


IDA로 해당 PE 파일을 뜯어보면 AMD64 체계의 PE 파일인 것을 알 수 있다.


View → Open subviews → Strings 로 문자열을 확인해보면 PE 파일 실행 시 출력되는 “Input:” 다음으로 “%256s”가 보이는데 이것이 입력받는 부분으로 보인다. 그 아래로 참, 거짓 유무에 따른 출력 값을 볼 수 있다.


난 “Correct”를 출력하는 조건이 궁금하니 해당 문자열을 더블 클릭하고 View → Open subviews → Cross references(상호 참조)를 클릭해서 “Correct” 문자열이 참조되는 함수를 확인해보면, main에서 해당 문자열을 참조하고 있다.


“Correct”를 사용하는 곳을 F5 키로 디컴파일한다. 그러면 동작을 확인할 수 있다.


모든 동작을 완벽히 분석하려면 많은 지식과 많은 시간을 들여야하므로 쉽게쉽게 추론하며 동작을 이해하는 선에서만 문제를 풀도록 한다. 텍스트로 설명하고 사진찍기 귀찮아서다.

sub_7FF6C9891190은 “Input:”을 출력한다.
sub_7FF6C98911F0은 입력받은 값을 v4에 저장한다.
sub_7FF6C9891000은 입렫받은 v4를 비교하여 참이면 “Correct”를 출력한다.

이렇게 동작을 하므로 sub_7FF6C9891000 함수를 분석해야 한다.

아규먼트로 넘겨준 v4를 sub_7FF6C9891000 함수에서 a1 파라미터로 받아서 사용한다. strcmp 문자열 비교 함수로 입력받은 a1과 플래그를 비교하여 이 둘이 완전히 같다면 0을 반환한다.


플래그와 동일한 값을 입력하면 strcmp는 0을 리턴하고 이 리턴한 값을 0과 비교하여 같으면 true가 되니 puts(“Correct”);가 실행된다.


실행 파일에서 해당 문자열을 입력하면 “Correct”가 출력된다.

Published by