
리버싱 공부하는게 거의 초반이라 이 문제는 드림핵 설명에 따라가면서 풀이하였다.
IDA를 사용한다. 먼저 문제 파일과 관련된 PDB 파일을 업로드한 뒤 main 함수에서 디버깅을 진행하면 아래와 같은 결과를 확인할 수 있다.

main()의 디컴파일 결과
코드를 해석해보면 아래와 같이 정리할 수 있다.
즉, memcmp가 실행되는 시점에서 flag 지역 변수에 어떤 값이 들어있는 지 알아낸다면 해당 값이 Correct!를 출력하는 입력이 된다. 여기서 gen_flag는 flag를 정답 문자열로 채우는 함수라고 생각하면 쉽다. => input이 어떤 값이던 간에 정답은 gen_flag가 이미 flag에 써놓는다는 점이다.

memcmp(input, flag, 0x17uLL)가 실행되는 지점에 중단점을 걸면 해당 코드가 실행되기 직전에 프로그램의 실행이 멈추게 되며, 그 상태에서 memcmp()의 2번째 인자인 flag 배열의 값을 확인할 수 있다.
그런데 IDA에서 보이는 주소와 WinDbg에서 보이는 주소가 다르게 보이는데, 그 이유는 Windows는 프로그램을 실행할 때 보안때문에 매번 다른 위치에 프로그램을 올릴 수 있기 때문이다.
이러한 이유로 인해 IDA에서 RVA(상대거리)만 뽑아낸다. IDA 주소는 보통 아래와 같이 구성되어있다.
IDA 주소 = (기준점: Image Base) + (상대거리: RVA) => 가상 주소 = 이미지 베이스 + 상대 가상 주소