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

: 문자열 찾기를 통해 메인함수를 찾았고, 메인함수의 위의 그림과 같다.
메인함수를 보면 어떠한 값을 입력받아서 <sub_7FF69B141000> 함수에서 비교를 하고, 해당 함수에서 나온 eax 값을 통해 correct와 wrong을 출력하는 함수임을 알 수 있다.
또한 je 명령어를 통해, eax가 0이면 wrong을 출력함으로, <sub_7FF69B141000> 내에서 eax값이 0이 아니어야 한다는 것을 알 수 있다.
< sub_7FF69B141000 >


<sub_7FF69B141000> 함수 내부는 위의 그림과 같다.
Main 함수에서 eax 값이 0이 되면 안되므로, 7번으로 진행하면 안된다는 것을 알 수 있다.
< 1번 블록 >
1. | mov qword ptr ss:[rsp+8],rcx |
: [rsp+8] = rcx (스택 증가로 인해 [rsp+20]에 rcx 저장) (rcx = input)
2. | sub rsp,18 |
: 스택 증가
3. | mov dword ptr ss:[rsp],0 |
: [rsp] = 0 ([rsp] = index)
4. | jmp chall6.7FF69B14101A |
< 2번 블록 >
5. | movsxd rax,dword ptr ss:[rsp] |
: rax = [rsp] (rax = index)
6. | cmp rax,12 |
: rax와 0x12(10진수로 18) 비교
7. | jae chall6.7FF69B141055 |
: rax >= 0x12 이면 3번 블록으로 점프, rax < 0x12 이면 4번 블록으로 진행
< 4번 블록 >
8. | movsxd rax,dword ptr ss:[rsp] |
: rax = [rsp] (rax = index)
9. | mov rcx,qword ptr ss:[rsp+20] |
: rcx = [rsp+20] ( rcx = input)
10. | movzx eax,byte ptr ds:[rcx+rax] |
: eax = input(index)
11. | lea rcx,qword ptr ds:[7FF69B143020] |
: rcx = [7FF69B143020]
12. | movzx eax,byte ptr ds:[rcx+rax] |
: eax = [7FF69B143020] + input(index)
13. | movsxd rcx,dword ptr ss:[rsp] |
: rcx = [rsp] (rcx = index)
14. | lea rdx,qword ptr ds:[7FF69B143000] |
: rdx = [7FF69B143000]
15. | movzx ecx,byte ptr ds:[rdx+rcx] |
: ecx = [7FF69B143000](index)
16. | cmp eax,ecx |
: eax와 ecx 비교
17. | je chall6.7FF69B141053 |
: eax와 ecx가 같으면 5번 블록으로 점프
- <결과>
: eax값 : [7FF69B143020] + input(index)
: ecx값 : [7FF69B143000](index)
< 6번 블록 >
18. | mov eax,dword ptr ss:[rsp] |
: eax = [rsp]
19. | inc eax |
: eax = eax+ 1
20. | mov dword ptr ss:[rsp],eax |
: [rsp] = eax
- <결과>
: [rsp]값 1 증가
: 다시 2번 블록으로 돌아가서 4-5-6-2-…의 과정을 반복함 (rax < 0x18 까지)
< 코드 작성 >

[7FF69B143020]를 add1 리스트로 담고,
[7FF69B143000]는 add2 리스트에 담아서 두 값이 같아지는 값들을 찾은 결과
Replac3_the_w0rld 라는 답이 나왔다.
정답 : Replac3_the_w0rld
'Reversing > DreamHack' 카테고리의 다른 글
[DreamHack_Wargame] rev_basic_8번 (0) | 2021.05.24 |
---|---|
[DreamHack_Wargame] rev_basic_7번 (0) | 2021.05.24 |
[DreamHack_wargame] rev_basic_5번 (0) | 2021.05.15 |
[DreamHack_wargame] rev_basic_4번 (0) | 2021.04.13 |
[DreamHack_wargame] rev_basic_3번 (0) | 2021.04.13 |