문제
이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출력하는 입력값을 찾으세요!
Correct가 출력되는 부분을 찾았다! 00007FF655AC117E 주소 결과에 따라 Correct와 Wrong이 출력되는 것 같다.
함수 부분은 이렇게 되어 있고, 요약하면 아래와 같다.
입력된 값 중 가장 첫 번째 값을 0x31(1), 두 번째 값을 0x32(2)라고 하자.
1. eax에 입력된 값 중 가장 첫 번째 값 넣기 => eax = 31
2. ecx에 + 1 수행(이때 ecx의 값은 반복문을 돌면서 값이 1씩 커진다.)
3. eax+ecx 주소에 해당되는 값을 ecx에 넣기 => ecx = 32
4. eax에 eax+ecx 값 넣기 => eax = 63
5. 7FF655AC3000에 있는 값을 ecx에 넣고 eax와 비교(반복문 돌 수록 주소 +1씩 증가)
이때 7FF655AC3000에 있는 값은 아래와 같다.
즉 정리를 하자면,
이런 식으로 계산이 되는 것이다.
이때 우리는 가장 마지막 입력값인 XN을 알아낼 수 있다.
4C = 0 + XN이기 때문에, XN = 4C이다.
그럼 그 다음 숫자인 XN-1도 알아낼 수 있다.
98 = 4C + XN-1이기 때문에, XN-1 = 4C가 된다.
이걸 이제 코드로 짜보자.
코드는 위와 같이 짰다.
그랬더니 문자열이 출력되었고, 이를 입력하였더니 문제가 풀렸다!
정답 : DH{All_l1fe_3nds_w1th_NULL}
'Wargame > dreamhack' 카테고리의 다른 글
dreamhack rev-basic-6 (0) | 2021.06.29 |
---|---|
dreamhack rev-basic-4 (0) | 2021.05.26 |
dreamhack rev-basic-3 (0) | 2021.05.19 |
dreamhack rev-basic-2 풀이 (0) | 2021.05.15 |
dreamhack rev-basic-1 풀이 (0) | 2021.05.15 |