본문 바로가기

Reverse Engineering/Wargame

Dreamhack : rev-basic-2

문제 링크

https://dreamhack.io/wargame/challenges/16

 

rev-basic-2

Reversing Basic Challenge #2 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출

dreamhack.io

 

 

풀이

 

그림 1

 

문제의 파일을 IDA로 열었을 때, 위 그림 1과 같은 로직을 확인할 수 있다. 그리고 디컴파일(F5) 시, 아래 그림 2와 같다. 

 

그림 2

 

사용자 입력을 받고, sub_140001000 함수에서 처리가 이뤄진 후, Correct와 Wrong 둘 중 하나가 결정되는 것으로 보인다. 

 

그림 3

 

해당 함수( sub_140001000)를 위 그림 3에서 살펴본다. 반복문이 18번 도는데, 기존의 배열(?) 값과 일치하지 않는다면 반복문이 종료되는 로직이다. 

 

그림 4

 

 

그림 5

 

아래에서 추가적으로 분석을 수행해보았다. 

 

그림 6

 

동적 디버깅을 위해서 BP를 위 함수 호출부분에 걸고, 프로세스를 실행(F9) 시켜보았다. 

 

그림 7

 

F9 이후에, 해당 함수에서 브레이크가 걸리고, F7(Step into) 해보았다. 

 

그림 8

 

사용자의 입력 값이 rcx에 저장되는데, 위 그림 8에서도 확인할 수 있다. 

 

그림 9

 

위 그림 9에서는 cmp와 jnb가 로직에 주요한 영향을 미친다. 먼저 cmp에 의해 두 피연산자(rax, 18)가 비교되어지는데, 앞의 피연산자가 더 작으므로 jnb(A가 B보다 크거나 같다) 로직 조건에 참이되지 않아 왼쪽으로 분기되어진다. 

 

그림 10

 

위 그림 10에서 lea rcx, aC 에서 aC 배열(전역 변수)의 주솟 값이 rcx에 할당되어짐을 확인할 수 있다. 

 

그림 11

 

위 그림 11에서는 아래 그림 12에서의 레지스터 R8 값의 변화를 보기 위해 신경써야 할 부분이 있다. 현재 RSP+0x20 에 들어있는 스택 메모리 주소 000000F091D2F9E0 이다. 

 

그림 12

 

해당 r8이 가지고 있는 메모리 주소에는 사용자의 입력 값이 위치해 있다. 

 

그림 13

 

위 그림 13의 빨간 박스에서 사용자 입력 값과 기존 배열 aC 값을 하나 비교하고, 분기로직에 따라 참이면 다시 해당 빨간 박스의 로직으로 돌아오게 되어 값을 비교하게 됨을 알 수 있다.