보안 / AI / 프로그래밍

[Reversing] rev-basic-0 문제풀이 본문

WarGame/DreamHack

[Reversing] rev-basic-0 문제풀이

DevKTW 2021. 2. 22. 22:42
Debugger 는 x96dbg 프로그램을 사용했습니다.

 

먼저 Debugger 로 프로그램을 실행해 봤습니다.

아무 문자열이나 입력해보았다. 우리는 비밀번호가 무엇인지 찾아야 한다.

일단 저 "Input :" 문자열이 입력되는 곳, 입력한 "aaaaaaaaaaaaa"이 저장된 곳 위주로 찾았습니다.

그 주변에서 입력받은 문자열이 맞는지 아닌지 대조하는 조건분기점이 있을 것이라고 예상했기 때문입니다.

 

첫번째 BP(BreakPoint)는 문자열을 출력하는 함수입니다. 보통 call을 할 때, call 하는 함수의 필요한 인자들을 레지스터에 담아두고 call을 부릅니다. 자세히 보시면 rcx 레지스터에 "Input :" 문자열을 가진 메모리 주소를 담는 것을 볼 수 있습니다.

 

세번째 BP를 보시면 eax가 0인지 아닌지 검사하고 있습니다. 만약 0이면 wrong을 , 아니면 Correct를 출력한다는 것을

추측할 수 있습니다.

 

그럼 eax를 마지막으로 어디서 사용하는지 알아야겠죠. 그래서 test 위에 있는 call을 따라가 봤습니다.

 

잘보시면 test 분기점에서 또 eax가 0인지 아닌지 검사하고 있습니다. eax가 0이 아니면 ss[rsp+20] 에 1이,

eax가 0이면 ss:[rsp+20]에 0이 담기고, 마지막으로 공통적으로 ss:[rsp+20]을 eax에 담고 함수를 나갑니다.

 

즉 우리는 eax가 결과적으로 0이 아닌상태로 저장되어 원래 함수로 넘어가야 하기때문에, 이 함수 내부의 test 조건 분기점에서 eax는 0이 되어야 합니다. 그래야 jne에서 점프를 안하고 ss:[rsp+20]에 1이 저장되고, 함수 마지막의 mov 를 통해 eax 에 1이 저장됨으로써, 함수를 종료한 후에 Correct로 점프할 수 있기 때문입니다.

 

call<JMP.&strcmp> 함수는 두 문자열을 비교해서 동일하면 0을, 틀리면 1을 eax에 저장합니다.

call 을 호출할때 넘겨지는 인자로 추측되는 rcx와 rdx가 서로 같은 문자열이면 되므로,

 

정답은 Compar3_the_string 임을 알 수 있습니다.

 


참고로 디버깅을 할 때, 결과출력과 더불어 바로 cmd창이 꺼지는 현상은 아래의 설정을 통해 해결할 수 있습니다.

메뉴바의 설정 -> 환경설정 -> 이벤트 탭 -> Exit BreakPoint 체크

'WarGame > DreamHack' 카테고리의 다른 글

[Reversing] rev-basic-2 문제풀이  (0) 2021.02.23
[Reversing] rev-basic-1 문제풀이  (0) 2021.02.23
Comments