오랜만에 리버싱 풀어본다.
제일 쉬운 것부터 풀어보자.
파일을 다운받고, 실행해보면
이런 창이 뜨는데, 리버싱을 통해 비밀번호를 알아내고 푸는 문제인 것으로 보인다.
일단 x64 dbg를 켜서 파일을 분석해보자.
문자열 찾기를 이용해서 의심가는 메모리 위치로 이동해 보자.
뭔가 "Congratulation!!" 이 부분에 단서가 있을 듯 하다.
입력값을 받고, 어떠한 위치에서 'E'와 비교하는 듯 싶다. 덤프에서 따라가기로 확인해 본 결과 비밀번호 첫번째 자리에 "E"가 들어오는 것 같다. 적절한 위치에 bp를 걸고, F9를 눌러 실행시켜보자.
일단 비밀번호를 아무렇게나 적어봤다. 그리고 확인을 눌렀더니, bp 지점에서 멈춘 것을 확인할 수 있다. 여기서 F8을 눌러 변화를 하나하나씩 확인해보자.
만약 a와 같지 않다면 Incorrect로 이어진다. 아마 비밀번호 안에 a가 있을 것이고, a의 위치를 알아내야 될 듯 하다. esp+5에 위치한 값과 비교하고 있으므로, esp+5에 있는 값이 어디에 위치하는지 알아보기 위해 덤프에서 따라가기로 이동해 보았다.
내가 입력한 값의 두번째 자리에 위치해 있는걸 확인했다. 이로서 두번째 자리에는 a가 들어옴을 확인했다. 나머지 자리의 문자도 확인해 보자.
lea 명령어:
주소값을 저장하는 명령어
계속 f8로 이동하다 보면 ecx에 3번째 자리부터 끝까지의 문자열이 저장되어 있는 걸 확인할 수 있다.
test명령어를 통해, zf = 1일때 je이고, zf = 0일때 jne임을 알 수 있다. zf가 1로 설정되기 위해서는 cl이 0이 되어야 하는데, 레지스터를 보면 1이라는 것을 알 수 있다. 아무래도 call 함수를 통해 무언가 실행되고, 다시 리턴해서 test 함수를 거쳐 Incorrect인지 판별하는 것으로 보인다.
3, 4번째 자리에 5y를 넣어보고 다시 돌려보자.
성공적으로 EAX의 값이 0이 된 걸 확인할 수 있다.
cmp 명령어를 통해 R3versing과 입력받은 값을 하나씩 비교하는 걸 확인할 수 있다. Ea5y이후의 값은 R3versing이라는 걸 알아낼 수 있다.
조합하면 Ea5yR3versing이다. 한번 확인해보자.
성공