본문 바로가기
étude/reverse engineering

dreamhack : rev-basic-5

by mummoo 2023. 11. 5.

문제

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

풀이과정

 
분석 대상 함수인 7FF ~ 1000 으로 들어간다.

 
알아내야 하는 값 (= 내가 입력해야 하는 값 = 플래그)을 input이라는 문자열이라고 하고, 
버퍼에 저장된 값을 buffer라고 하면
결국 코드들의 큰 흐름을 봤을 때 input[i] + input[i+1] == buffer[i]인 input값을 찾아내야 한다.
이때 i는 0x18, 즉 24 전까지 반복된다. 
0x00 <= i <= 0x17까지 input[i] + input[i+1] == buffer[i]가 반복될 것이다!
 
우리가 알아내야 하는 것은 input인데, 아는 것은 buffer밖에 없으니 input을 buffer로 나타내야 한다.
 
input[0] + input[1] = buffer[0]
input[1] + input[2] = buffer[1]
input[2] + input[3] = buffer[2]
:
input[23] + input[24] = buffer[23]
 
여기서 고려 사항 몇 가지
1. input은 문자열이므로, 마지막 값은 null값이다. 즉 input[24]는 null값이다. 
=> input[23] = buffer[23]
 
2. 각 식을 더하고 빼고 반복하면
input[0] - input[24] = buffer[0] - buffer[1] + ... - buffer[23]
=> input[0] = buffer[0] - buffer[1] + ... - buffer[23]
=> input[1] = buffer[0] - input[0]
                  = buffer[1] - buffer[2] + ... + buffer[23]
:
=> input[23] = buffer[23]
 
3. 즉, 인덱스 i에 대해서
i = 23 이하의 짝수일 때
input[i] = buffer[i] - buffer[i+1] + ... - buffer[23]
 
i = 23 이하의 홀수일 때
input[i] = buffer[i] + buffer[i+1] - ... + buffer[23]
 
해당 수도코드를 c언어로 구현해보면
 

 

 
플래그 : All_l1fe_3nds_w1th_NULL
 
플래그값처럼, 모든 문자열은 null로 끝남을 이용해 풀면 되는 문제였다!!!

'étude > reverse engineering' 카테고리의 다른 글

[어셈블리어] shift / ROL, ROR  (2) 2023.12.03
dreamhack : rev-basic-6  (0) 2023.11.05
dreamhack : rev_basic_7  (0) 2023.11.04
dreamhack : rev_basic_3  (0) 2023.08.06
dreamhack : rev_basic_2  (0) 2023.08.05