본문 바로가기

Reversing/DreamHack

[DreamHack_Wargame] rev_basic_8번

문제 : 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 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 방식을 사용하여 모두 대입해서 찾아내는 방식으로 코드를 작성하였다.

 

 

< 문제 인증 >