본문 바로가기

Reversing/DreamHack

[DreamHack_Wargame] rev_basic_6번

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

 

 

 

< Main 함수 >

 

: 문자열 찾기를 통해 메인함수를 찾았고, 메인함수의 위의 그림과 같다.

메인함수를 보면 어떠한 값을 입력받아서 <sub_7FF69B141000> 함수에서 비교를 하고, 해당 함수에서 나온 eax 값을 통해 correctwrong을 출력하는 함수임을 알 수 있다.

 

또한 je 명령어를 통해, eax0이면 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