문제 : 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출력하는 입력값을 찾으세요.
< main 함수 >

다른 문제들과 동일하게 입력받은 값과 정답을 비교하기 위해서는 위의 체크되어있는 함수로 이동해서 어떻게 비교하는 과정을 거치는지 확인해야 한다.
해당 문제에서도 동일하게, 위의 함수에서 eax가 0이 아닌 채로 빠져나와야 correct가 출력됨을 알 수 있다.
< 7FF793A61000 >

해당 함수 내부로 들어오면 위의 그림과 같이 함수가 이루어져 있는 것을 볼 수 있다.
조금 더 보기 편하도록 그래프 모드로 변환하면 아래의 그림과 같다.

메인 함수에서 이야기 했던 것과 같이, eax값이 0이 되면 안되므로 위의 그림에서 6번 블록으로 진행하면 안되는 것을 알 수 있다.
따라서 전체 함수의 진행 방향을 확인하면
1 -> 2 로 진행한 후, 4 -> 5 -> 7 ->2를 반복하다가 마지막에는 2 -> 3 -> 8로 진행하여 함수를 빠져나가는 것을 알 수 있다.
< 1번 블록 >
1. | mov qword ptr ss:[rsp+8],rcx |
: [rsp+8 ] = rcx = input
| sub rsp,18 |
: 스택 증가 (스택 증가로 [rsp+20] = rcx = input)
2. | mov dword ptr ss:[rsp],0 |
: [rsp] = 0 = index
3. | jmp chall8.7FF793A6101A |
< 2번 블록 >
1. | movsxd rax,dword ptr ss:[rsp] |
: rax = [rsp] = index
2. | cmp rax,15 |
: rax와 0x15 비교
3. | jae chall8.7FF793A61055 |
: rax >= 0x15이면 3번 블록으로 점프, rax < 0x15이면 4번 블록으로 진행.
< 4번 블록 >
1. | movsxd rax,dword ptr ss:[rsp] |
: rax = [rsp] = index
2. | mov rcx,qword ptr ss:[rsp+20] |
: rcx = [rsp+20] = input
3. | movzx eax,byte ptr ds:[rcx+rax] |
: eax = [rcx+rax] = input[index]
4. | imul eax,eax,FB |
: eax = eax * 0xFB = input[index] * 0xFB
5. | and eax,FF |
: eax = eax & 0xFF = (input[index] * 0xFB) & 0xFF
6. | movsxd rcx,dword ptr ss:[rsp] |
: rcx = [rsp] = index
7. | lea rdx,qword ptr ds:[7FF793A63000] |
: rdx에 [7FF793A63000] 주소값 저장
8. | movzx ecx,byte ptr ds:[rdx+rcx] |
: ecx = [rdx+rcx] = [7FF793A63000][index]
9. | cmp eax,ecx |
: eax와 ecx 비교
(input[index] * 0xFB) & 0xFF 와 [7FF793A63000][index]
10. | je chall8.7FF793A61053 |
< [7FF793A63000] >

해당 주소값 내부에는 위의 그림과 같은 값들이 담겨져 있음을 확인할 수 있다.
0xAC, 0xF3, 0x0C, 0x25, 0xA3, 0x10, 0xB7, 0x25, 0x16, 0xC6, 0xB7, 0xBC, 0x07, 0x25, 0x02, 0xD5, 0xC6, 0x11, 0x07, 0xC5, 0x00
< 코드 작성 >

파이썬 코드로 작성하였고, brute force 방식을 사용하여 모두 대입해서 찾아내는 방식으로 코드를 작성하였다.
< 문제 인증 >

'Reversing > DreamHack' 카테고리의 다른 글
[Reversing] Dreamhack_ ssp_001 Handray (0) | 2022.08.26 |
---|---|
[Reversing] Dreamhack_basic_exploitation_000 문제 Handray (0) | 2022.08.25 |
[DreamHack_Wargame] rev_basic_7번 (0) | 2021.05.24 |
[DreamHack_Wargame] rev_basic_6번 (0) | 2021.05.15 |
[DreamHack_wargame] rev_basic_5번 (0) | 2021.05.15 |