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가 나온다.
'전공' 카테고리의 다른 글
도쿄공업대학 기계학습 강좌 자료 (0) | 2021.12.17 |
---|---|
Python으로 기초부터 기계학습 [로지스틱 회귀분석] (0) | 2021.02.21 |
Scikit-learn으로 로지스틱 회귀 (클래스 분류편) (1) | 2021.01.25 |
Scikit-learn(사이킷런)으로 선형회귀 (0) | 2020.09.24 |