Wargame/dreamhack

dreamhack rev-basic-4

esyeonge 2021. 5. 26. 00:21

문제

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

 

언제나 그랬듯 correct가 출력되니까 correct 문자열을 찾아서 해당 주소로 가보자!

해당 주소로 가보면 바로 위에 je, 그 위에 test, 그 위에 call이 있음을 알 수 있다.

아무래도 call의 결과에 따라서 correct와 wrong이 정해지는 것으로 보인다.

00007FF7234E117E 주소에 BP를 걸어둔 후 실행해보자.

 

함수 코드는 위와 같고 정리하면 아래와 같다.

첫 번째 입력값 = 0x31(1) 이라고 해보자.

1. eax에 첫 번째 입력 값을 넣고 오른쪽으로 4비트 shift => 0000 0011
2. ecx에 첫 번째 입력 값을 넣고 왼쪽으로 4비트 shift => 0011 0001 0000
3. ecx와 F0을 and 연산 취해주어서 뒤에서 5-8번째 비트 값만 남도록 설정 => 0001 0000
4. eax와 ecx를 or 연산한 후 eax에 저장 => eax에는 앞에 4비트가 값이 없고, ecx에는 뒤에 4비트가 값이 없으니까 ecx eax 이런 식으로 값이 나올 것. 즉 0001 0011를 eax에 저장
5. 덤프의 7FF7234E3000 주소에 있는 값과 eax를 비교(반복될 수록 주소는 +1바이트 된다)

 

덤프의 7FF7234E3000 주소에 있는 값은 아래와 같다.

 

그럼 역산하는 코드를 짜서 풀어보자!

하나하나 계산을 해도 된다.

계산을 할 거면 아래와 같이 하면 된다.

1. 24 == 0010 0100이다.

2. 이때 0010은 ecx의 값, 0100은 eax의 값이다.

3. ecx는 왼쪽 shift가 된 것이니 0010은 원래 입력값의 하위 4비트였을 것이다.

4. eax는 오른쪽 shift가 된 것이니 0100은 원래 입력값의 상위 4비트였을 것이다.

5. 원래 입력값은 0100 0010 = 42가 된다. (처음 숫자를 반대로 뒤집은 것)

6. 0x42는 Ascii 값으로 B가 된다.

 

python 코드는 위와 같다!

 

실행 결과는 위와 같이 나온다.

 

이를 입력하였더니 문제가 풀렸다!

답 : DH{Br1ll1ant_bit_dr1bble_<<_>>}

'Wargame > dreamhack' 카테고리의 다른 글

dreamhack rev-basic-6  (0) 2021.06.29
dreamhack rev-basic-5  (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