본문 바로가기
category/리버싱

xor, or 리버싱 문제풀이

by 자운대고라니 2023. 2. 21.
반응형

Input Your name에서 name을 입력을 받고, Input Your Serial에서 serial을 입력받는다. 정상적이지 않은 값을 넣으면, Permission deny라는 문구가 나온다.

 

문제의 정황상 name으로 인해서 serial 값이 생성된다고 추측할 수 있다.

 

가장 먼저 PEID 프로그램을 사용해 패킹의 유무를 판단한다.

EP Section 부분이 .text로 돼있으므로, 패킹이 되지 않았단 걸 확인할 수 있다.

xdbg를 이용해 코드를 분석한다.

패킹이 되지 않았으므로 그림과 같이 문자열 참조를 통해 프로그램의 메인 부분을 찾아본다.

프로그램 실행시 출력되는 메시지 Input your nameInput Your Serial이 있다. 해당 주소로 이동한다.

해당 주소로 이동해서 조금만 아래로 내린다면 Permission success!!Permission deny!!라는 문자열을 확인할 수 있다.

je 함수로 필터링하여 정상적인 접근과 비정상적 접근 두 개로 나눈다는 것을 알 수 있다.

일단 Input 부분에 breakpoint를 걸고 실행해본다.

Name : ABCDefgh

Serial : EGegGMnm

해당 값들을 넣고, F8을 이용해서 한줄 한줄 넘기다보면 아래와 같이

ecx8자리 이상한 문자가 저장되는 것을 확인할 수 있다.

 

EGEGgmom이라는 값이 004015A4주소의 4016D3 함수를 호출한 부분 이후에 ecx에 저장됐다.

 

문제에서 요구하는 8자리 문자열이므로 ABCDefgh에 대한 serial로 추측된다.

 

Name : ABCDefgh

Serial : EGEGgmom

Permission success!!라는 문구가 정상적으로 출력됐다.

그렇다면 4016D3 함수에서 serial값을 만드는 알고리즘이 있다고 추측할 수 있다. 해당 부분에 breakpoint를 걸고 프로그램을 재실행시킨 후 Name : ABCDefgh

Serial : EGEGgmom

입력 후 해당 함수 부분에 F7을 이용해 접속했다.

해당 함수를 넘기다 보면 00416E1주소에서 jump 함수까지 총 8번 실행 후 해당 함수를 탈출하는 부분을 찾았다. 문자열이 8자리임을 감안하여, 00416E1 ~ jump 까지가 serial을 만드는 알고리즘 부분이라고 추측할 수 있다.

(counting 변수 현재 2번 반복했을 시 2가 저장됨)

00416E1주소에 브레이크 포인트를 걸고 다시 실행시켜본다.

add eax,1이 있다. 여기서 eax는 문자열에서 문자 하나를 뜻한다.

eax : A -> B로 변환됐다는 뜻이다.

그 후 eaxedxxor 연산을 시행한다.

EDX6이라는 값이다.

그 후 eaxedxor 연산을 시행한다.

EDX5라는 값이다.

이후 jump로 반복문이 시행된다.

이 과정에서 문자열의 첫 번째 문자는 E라는 문자가 나왔다.

, serial 값을 만드는 알고리즘이라고 확신할 수 있다.

 

지금까지 시행한 연산을 총 정리하면 “((문자 + 1) xor 6) or 5” 라는 알고리즘으로 추측할 수 있다.

이를 c언어로 먼저 작성해본다.

EEGGeeoo라는 문자열이 출력된다.

Name : ABCDefgh

Serial : EGEGgmom

올바른 Serial과 다르다는 것을 알 수 있다.

, 각각 문자열의 자리마다 시행하는 연산이 다르다. 동일한 방법으로 2~8번째 자리까지 분석을 시행해본다.

2번째 자리인 B도 똑같이 add eax,1 함수로 1을 더한다.

1번째 자리와 동일하고 xor eax, edx를 시행한다.

EDX5 값을 가지고 있다.

or eax,edx 연산도 동일하기 시행한다.

EDX5 값을 가지고 있다.

1~4번째 자리까지 xor 연산을 시행하는 edx의 값만 다르고 add 1or 5는 모두 동일했다.

 

하지만 5번째 인 e를 시행할때부터 달라졌다.

sub eax, 1을 통해 문자에서 1을 뺀다.

후에 edxxor연산을 시행한다. 이는 앞서 1~4자리와 동일하게 자릿수마다 각각 다른 값으로 연산을 시행한다.

후에 edxor연산을 시행한다. 이때 or 연산은 모두 4로 동일했다.

지금까지 시행된 알고리즘을 총 정리하면

1~4번째 “((문자 + 1) xor 자리마다 다른 값) or 5”

5~8번째 “((문자 - 1) xor 자리마다 다른 값) or 4”

 

xor edx - {6,5,5,2,7,8,9,10}

 

 

단순하게 1~4번째 자리와 5~8번째 자리의 연산이 다르다 생각할 수 있지만, call 454080 함수에 의해서 문자가

대문자 -> eax=1 소문자 ->eax=0으로 바뀌면서 je문에서 필터하여 각각 다른 로직으로 넘어가도록 설계돼있다.

 

결국

 

대문자 “((문자 + 1) xor 자리마다 다른 값) or 5”

소문자 “((문자 - 1) xor 자리마다 다른 값) or 4”

xor edx - {6,5,5,2,7,8,9,10}

 

라는 결론을 낼 수 있다.

반응형

'category > 리버싱' 카테고리의 다른 글

a10 문제풀이  (1) 2023.02.22

댓글