문제
이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출력하는 입력값을 찾으세요!
언제나 그랬듯 [오른쪽 마우스 - 다음을 찾기 - 모든 모듈 - 문자열 참조]를 눌러서 문자열을 검색해준다!
Correct가 보이니 해당 위치로 이동한 후, 분기점을 찾아보자.
분기점은 00007FF711251175이고, 00007FF71125116E에서 호출되는 함수의 결과에 따라 Correct와 Wrong이 나누어진다. 00007FF71125116E에 BP를 걸어둔 다음 살펴보자.
함수를 살펴보면 다음과 같다. (abcd를 입력한 후, 첫 번째 도는 경우)
1. rax에 0 넣기(반복문이 다시 돌면 inc eax를 통해 1이 증가된다)
2. rcx에 입력 값 넣기
3. eax에 rcx+rax 값 넣기
첫 번째 도는 경우에는 rax 값이 0이기 때문에 입력 값의 가장 첫 번째 문자인 a가 들어간다.
4. rcx에 7FF797343020 주소 넣기
참고로 7FF797343020에 있는 값은 아래와 같다.
5. eax에 rcx+rax인 주소에 해당되는 값 넣기 -> 7FF797343020 + 입력한 값
이 경우에는 a의 값이 61이기 때문에 7FF797343020 + 61 = 7FF797343081 주소에 해당되는 값인 EF가 eax에 들어가게 된다.
6. rcx에 ss:[rsp] 값(==반복문을 돈 횟수)을 넣은 후, rdx에 7FF797343000 주소 넣기
7FF797343000에 있는 값은 아래와 같다.
7. ecx에 rdx+rcx 값 넣기 -> 처음일 경우 7FF797343000 값인 00이 들어가게 됨
8. eax랑 ecx 비교하고 같으면 반복문 다시 돌고, 아니면 Wrong을 출력한다!
함수에서 가장 중요한 부분은 위와 같다.
그럼 어떤 식으로 입력 값을 찾아야 하는 지 생각해보자.
(7FF797343020 + 입력값 중 첫 번째 문자의 hex 값) 주소에 해당되는 값이 7FF797343000에 있는 값과 같아야 한다.
7FF797343000에 있는 값은 00이고, 덤프를 보면 00의 값은 7FF797343072에 있음을 알 수 있다.
그렇기 때문에 첫 번째 입력값은 0x52가 되어야 하고 아스키 코드 값으로는 R이 된다.
R을 넣어보자.
R을 넣으면 cmp eax, ecx에서 둘 다 00이 입력 되어 반복문을 다시 돌게 된다.
그럼 이제 이걸 구하는 코드를 짜보자 . .!!
코드는 위와 같이 짰다.
valueList2의 경우에는 아스키코드 hex값이 0x7F까지만 있기 때문에 7FF79734309F까지만 가지고 왔다.
실행 결과는 위와 같고, 이를 입력하니 문제가 풀렸다!
'Wargame > dreamhack' 카테고리의 다른 글
dreamhack rev-basic-5 (0) | 2021.05.26 |
---|---|
dreamhack rev-basic-4 (0) | 2021.05.26 |
dreamhack rev-basic-3 (0) | 2021.05.19 |
dreamhack rev-basic-2 풀이 (0) | 2021.05.15 |
dreamhack rev-basic-1 풀이 (0) | 2021.05.15 |