WARGAME/reversing

[Crackme] #1

lucykorea414 2023. 9. 11. 17:56
728x90

학교 수업 중에 진행되었던 크랙미 1번을 풀이해봅시다~~

 

실행을 하면 패스워드를 입력하라는 창이 뜨고

아무거나 입력해보면 프로그램이 꺼진다. 알맞은 패스워드를 입력해야지 실행되는것으로 보임!

 

 

아이다 프로로 먼저 분석을 해보자

일단 psedocode를 보면 다음과 같이 나와있는데, 무조건 패스워드의 길이는 24여야지 넘어가는것으로 보인다. 

이부분은 어셈블리에서도 확인이 가능하다

여기에서 패스워드를 입력받고 esp+0ACh+Format 이라는 곳에 아까 저장해뒀던 eax 를 넣고 있고 (우리가 입력한 값)

eax에 strlen이라는 함수를 불러 문자열의 길이를 저장하고 있다.

그 후, eax를 16진수로 18h, 즉 10진수로 24 길이와 비교하고 있다.

만약 아닐 경우 함수로 점프를 하지 못하게 되어 밑에 있던 No password가 실행되는 것이다

우리는 24글자를 만족한다고 치고 오른쪽의 함수로 진행해보자.

이때 esp+0ACh+var_10 에는 0 이라는 값이 들어오고 다른 함수로 점프를 하게된다.

(여기서 드는 느낌은 이 변수가 반복문의 i 값이라는 생각이 들어야 한다)

 

 

여기서 이제 동적 분석을 하기 위해 x32dbg로 분석해봅시다

일단 분기점이 되는 부분을 잘 분석해보면 다음과 같이 우리가 입력한 값을 xor 8 을 한 값과 esp+eas*4+38 이라는 주소에 있는 값들과 하나하나씩 비교하는 것을 볼 수 있다!

-> 그러면 덤프로 이 주소를 따라가서 24글자를 알아내고 각각 거꾸로 xor8 을 취해야겠다.

 

덤프

여기서 24글자는 7B 61 65 78 64 6D 57 6B 7A 69 6B 63 65 6D 2B 39 57 43 6D 61 4B 60 67 61 이라는 것을 확인 할 수 있고 이 친구를 각각 xor8하고 아스키 코드로 변화시키는 파이썬 코드를 짜봤다.

 

코드

def xor_and_ascii(hex_string, key):
    # 16진수 문자열을 바이트 배열로 변환
    bytes_array = bytes.fromhex(hex_string)

    # XOR 연산 및 결과 저장
    result_bytes = bytes(byte ^ key for byte in bytes_array)

    # 결과를 아스키 문자열로 변환
    result_ascii = result_bytes.decode('ascii')

    return result_ascii

hex_string = "7B 61 65 78 64 6D 57 6B 7A 69 6B 63 65 6D 2B 39 57 43 6D 61 4B 60 67 61"
key = 8

# 함수 호출
result = xor_and_ascii(hex_string.replace(' ', ''), key)
print(result)

결과

728x90

'WARGAME > reversing' 카테고리의 다른 글

[dreamhack] rev-basic-3  (0) 2023.09.22
[dreamhack] patch  (0) 2023.09.22
[dreamhack] rev-basic-1  (0) 2023.09.15
[dreamhack] rev-basic-0  (0) 2023.09.15
[abex crackme] 2번  (0) 2023.09.11