보안 / AI / 프로그래밍
[Reversing] rev-basic-0 문제풀이 본문
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창이 꺼지는 현상은 아래의 설정을 통해 해결할 수 있습니다.
'WarGame > DreamHack' 카테고리의 다른 글
[Reversing] rev-basic-2 문제풀이 (0) | 2021.02.23 |
---|---|
[Reversing] rev-basic-1 문제풀이 (0) | 2021.02.23 |