본문 바로가기

Reversing/DreamHack

[DreamHack_wargame] rev_basic_4번

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

 

1.    main 함수

: 메인함수에서 rcxrdx를 인자로 받아 입력 값을 비교하는 함수로 들어간다.

 

2.    비교 함수

: 2번째 블록에서 rax0x1c(28)를 비교하는 것으로 보아, 28번 비교하는 것을 알 수 있음.

: rcx는 입력받은 값 / [rsp]는 비교 횟수를 뜻한다.

: 검정 박스 안을 분석해야 함.

 

< 검정 박스 안 >

1. | movsxd rax,dword ptr ss:[rsp]           |

  : rax = [rsp]   ([rsp]는 실행 횟수)

2. | mov rcx,qword ptr ss:[rsp+20]           |

  : rcx = [rsp+20]    (rcx는 입력 값)

3. | movzx eax,byte ptr ds:[rcx+rax]         |

  : eax = [rcx+rax]    (eax = 입력 값+실행횟수)

4. | sar eax,4                               |

  : eax를 오른쪽으로 4만큼 shift

5. | movsxd rcx,dword ptr ss:[rsp]           |

  : rcx = [rsp]    ([rsp]는 실행 횟수)

6. | mov rdx,qword ptr ss:[rsp+20]           |

  : rdx = [rsp+20]  

7. | movzx ecx,byte ptr ds:[rdx+rcx]         |

  : ecx = [rdx+rcx]    (ecx = 입력 값+실행횟수)

8. | shl ecx,4                               |

  : ecx를 왼쪽으로 4만큼 shift

9. | and ecx,F0                              |

  : ecx = ecx & 0xf0   (ecx = ((입력값+실행횟수)<<4 & 0xf0)

10. | or eax,ecx                              |

  : eax = eax | ecx   

(eax = {(입력값+실행횟수)>>4} | {(입력값+실행횟수)<<4 & 0xf0)

11. | movsxd rcx,dword ptr ss:[rsp]           |

12. | lea rdx,qword ptr ds:[7FF7031E3000]     |

  : rdx에 [7FF7031E3000]값 저장

13. | movzx ecx,byte ptr ds:[rdx+rcx]         |

  : ecx = [rdx+rcx]   (rdx+실행 횟수)

14. | cmp eax,ecx                             |

  : eaxecx 비교

15. | je chall4.7FF7031E1063                  |

 

--------------------------------------- rdx에 저장된 값 -------------------------------------------------

해당 주소를 통해 들어가면 위와 같은 숫자들이 있음.

24  27  13  C6  C6  13  16  E6  47  F5  26  96  47  F5  

46  27  13  26  26  C6  56  F5  C3  C3  F5  E3  E3

 

------------------------------------------------------------------------------------------------------------

 

 

따라서,

eax = {(입력값+실행횟수)>>4} | {(입력값+실행횟수)<<4 & 0xf0) [7FF7031E3000]을 비교하는 코드를 통해 답을 알아낼 수 있음.

 

(파이썬을 통해 코드 작성함)

 

 

정답 : Br1ll1ant_bit_dr1bble_<<_>

>

'Reversing > DreamHack' 카테고리의 다른 글

[DreamHack_Wargame] rev_basic_6번  (0) 2021.05.15
[DreamHack_wargame] rev_basic_5번  (0) 2021.05.15
[DreamHack_wargame] rev_basic_3번  (0) 2021.04.13
[DreamHack_wargame] rev_basic_2번  (0) 2021.04.12
[DreamHack_wargame] rev_basic_1번  (0) 2021.04.12