오래 못 할 짓 하지 않기

[ 워게임 ] 36. Reversing 22 : Reversing Basic Challenge #8 본문

보안_모의해킹/CTF (Capture The Flag)

[ 워게임 ] 36. Reversing 22 : Reversing Basic Challenge #8

쫑알bot 2025. 2. 8. 11:11
728x90

 

앞부분은 항상 다 똑같길래 여기로 바로 옴

 

a1+i 는 반복문에 있을 땐  a[i] 로 취급하면 된다.

 

그럼 ( -5 * a1[i] = 비교할 문자열 ) 로 가면 되나

 

이제는 그렇게 풀 수가 없는 것 같다.

어셈블리어 레벨로 내려가서 보자.

 

인자로 받은 eax를 이래저래 계산하고 밑에서 두 번째에 cmp로 비교까지 하는 걸 보면

eax는 a1인 걸 알 수 있다.

그럼 그걸 어떻게 하는지 보자.

 

 

imul eax , 0FBh 를 보자

imul 명령어는 eax = eax * 0xFB 라고 생각하면 된다.

 

and eax , 0FFh 를 보면

2진수로 나열했을 때, 비트 두 개 모두 1인 경우만 1로 취급한다. 

 

그럼 주로 어떨 때 쓰냐?

8비트로 제한할 때 쓴다.

 

and 472913409128357012938 , 0FFh

= and  472913409128357012938 , 11111111

1111 1111 = 0000000...11111111이므로

472913409128357012938의 아래 8비트만 해당된다.

 

 

eax = a[i]라고 생각했을 때

imul eax , 0FBh

and eax , 0FFh

를 통한 결과가 byte_140003000[i]의 값과 같아야 한다.

 

 

0xFB와 곱하고, 0xFF와 and 연산을 거친 것이 byte_140003000[] 과 같은 걸 찾으려면

이건 brute force로 가는 게 맞을 것 같다.

 

to_decryp[] = byte_140003000[]

 

 

출발!!!

 

?????

조건문 다시 괄호 제대로 맞추니까 됐다.


회고

지금까지 디컴파일한 파일에서만 식을 보고 만들면 됐는데

이제는 어셈블리어에서 봐야할 것 같다.

디컴파일한 곳에서 보이지 않는 게 좀 있는 것 같음.

 

다음 단계로 조금 더 성장해야하는 경계선인 것 같다.