-
lvl 17Wargame/CodeEngn Basic RCE 2019. 1. 6. 23:53
문제
Key 값이 BEDA-2F56-BC4F4368-8A71-870B 일때 Name은 무엇인가
힌트 : Name은 한자리인데.. 알파벳일수도 있고 숫자일수도 있고..
정답인증은 Name의 MD5 해쉬값(대문자)
풀이
→ 프로그램을 실행한다. 아래와 같이 Name 값과 Key 값을 동시에 입력받은 후 확인하는 문제이다.
→ 바이너리를 디스어셈블한 결과, 아래와 같은 성공 분기를 확인할 수 있다. LStrCmp 함수에서 Cmp 하는 것을 확인할 수 있다.
→ 해당 함수 내부에서 cmp 처리된 후, 성공 분기 명령어인 jnz short loc_45BBC5가 실행되므로, LStrCmp 함수를 Trace 하여, 해당 함수 내부의 모든 cmp 명령어에 bp를 설정한 후, 디버깅을 시도한다.
→ 사용자 입력 값은, Name에는 "1234"와 Key 값은 문제대로 "BEDA-2F56-BC4F4368-8A71-870B"를 입력한 후 디버깅한다.
→ 함수 내부의 다음 코드에서 cmp 명령어가 결정되는 것을 확인할 수 있는데, EAX 레지스터는 key 값이 저장된 주소 공간임을 알 수 있고, EDX 레지스터는 1234가 일련의 작업을 거친 후 만들어진 key 값임을 알 수 있다. 아래는 해당 코드에서의 레지스터 값이다.
→ EAX 레지스터 값은 사용자 입력 key 값의 주소공간임을 확인한다.
→ EDX 레지스터 값은 사용자 입력 Name 값의 비교 값의 주소공간임을 확인한다.
→ 문제를 풀다가, 이전의 방식과 동일한 방법으로 풀면 더 힘들것 같은 느낌을 받았다. 따라서, 이번 문제에선 키 생성 원리를 파악해야할 것 같아서, 비교 함수 들어가기 전 코드를 분석하였다.
→ 해당 로직에서 사용자 입력 값 중 Name 변수의 1바이트를 이용하여 일련의 작업 후 key 값을 생성하는 것을 확인할 수 있다. 생성된 값은 "A672E340"이다.
→ 두번째, 키 값 생성 로직이다. 생성된 값은 "90518E8" 이다.
→ 이런 방식으로 로직을 분석하였음. 다시 첫번째 키 값 생성 로직으로 돌아와 문제에서 Name은 한자리 값이며, 알파벳과 숫자의 범위라고 지정하였다. 따라서, 처음 키 값 생성 로직만 제대로 분석해서 bruteforce 공격을 돌려보았다.
→ i 값이 70일 때, "beda"와 매칭되므로, 70의 아스키 문자는 "F"인 것을 확인할 수 있다. 따라서 정답은 "F"의 md5 값인 아래와 같다.
댓글