본문 바로가기

전공

선린 소수전공 리버싱 과제

rev-basic-1

들어가면 이런 화면을 볼 수 있는데, 문제에서는 'correct'를 출력하는 입력값을 알아내라는 것이였다.

if문에서 sub_140001000에 v4를 넣고 그값이 맞다면 correct를 출력한다는 것을 볼 수 있는데, 함수는 아래와 같다.

 

strcmp는 비교할 문자열과 같다면 0을 반환하는데, a1 즉 sub_1400011F0에서 입력받은 v4의 값이 Compar3_the_str1ng과 같다면 1을 반환한다는 소리고, if는 1이면 무조건 참이기 때문에 Correct가 출력된다.

따라서, Flag는 Compar3_the_str1ng이다.


rev-basic-1

rev-basic-0과 언뜻보기에는 거의 같다는 것을 알 수 있다. 

if문 안에 있는 함수로 들어가면 이런 조건문이 나온다.

이것의 if문에서 나오는 캐릭터들을 전부 조합하면 Flag는 Compar3_the_ch4ract3r라는 것을 확인할 수 있다.


rev-basic-2

이번에도 거의 비슷해보인다. 

이번엔 좀 형식이 다르다. for문을 0에서 0x12 전까지 돌리는 것을 볼 수 있는데, aC라는 배열과 v4가 들어간 a1을 i(*(a1+i)같은 경우 포인터로 배열을 참조한 것.)를 늘리면서 계속 비교한다는 것을 볼 수 있다.

 

배열로 들어가면 이것이 어느것과 비슷한지 알수 있고, 아까전에 4 * i 의 값은 .data:~~~~~~~~~0부분부터 4씩 늘어간다는 것으로 문자열을 어떻게 비교하는지 알 수 있다. Flag는 Comp4re_the_arr4y이다. 


 

rev-basic-3

basic-2와 비슷한 형식의 함수이다.

 

if문에 들어가면 반복문이 24번을 돈다는 것을 알 수 있고, 0i64를 리턴한다는 것을 알 수 있다.

그리고 반복문 안의 if문은 byte_140003000 배열과 (i ^ a[i]) + 2*i 배열을 서로 비교한다는 것을 알 수 있다.

^는 xor 연산자이다.

 

byte_140003000 배열에 들어가보면 이런 데이터가 들어가 있다는 것을 알 수 있다.

 

Hex방식으로 보면 아까 봤던 그 형식으로 Hex값이 있는 것을 볼 수 있다.

 

유추해볼때, 들어있는 Hex값과 같은 수를 반복문으로 돌리고, 비교할때는 입력받은 값에 XOR연산을 해서 비교한다.

이 값을 알아내려면 XOR 역연산을 해야한다.

 

XOR 연산은 이 식들이 성립한다.

 

A XOR(^) B = C

C ^ A = B

B ^ C = A

 

코드를 보면서 이런 식을 알아낼 수 있고, (if문에서의 !=는 ==이라고 생각해야 한다.)

flag_dump[i] == (i^input[i])+2*i

 

이 식을 

(flag_dump[i] - 2*i) ^ i == input[i] 

라는 식으로 바꿔도 성립한다.

 

이 식을 그대로 파이썬 코드로 만들어 적용한다.

flag가 나온 것을 볼 수 있다.

 


rev-basic-4

if문으로 들어간다.

if문에서  (16*a[i]) & 0xF0 | a1[i] >> 4 != byte_14003000[i] 라는 조건을 확인 할 수 있다.

byte_140003000의 배열 데이터이다. 

a에 Hex값을 넣고, (!=는 같다고 판단했기 때문에 뺐음) if문에서 들어갔던 조건들을 넣어준다. 

 

Flag가 나온다.