본문 바로가기

dreaMhack/Reverse Engineering

[드림핵] rev_basic_1 풀이/어셈블리어 해석

https://dreamhack.io/

 

https://dreamhack.io/wargame/challenges/15/

문제 파일을 다운로드받고 압축을 풀어준다

 

 

 

1. x64bug 해석

ctrl+f9를 누르며 진행하다 화면에 wrong이 출력됐을 때 함수 코드

본 함수의 코드들인데 여기에서 주목해야 할 점은 correct와 wrong을 출력해주는 부분이다

이 이전에 있는 함수에서 해당 문자열을 고를 반환값을 줬을 가능성이 높기 때문이다

call challo.7ff6c9fb1000

따라서 위의 코드 속 함수 주소를 더블 클릭 해주면 우리가 해석해야하는 함수의 코드들이 나오게 된다

 

이번 문제는 0번 문제와 비슷하게 오른쪽에 답이 다 나오지만

어셈블리어 학습을 위해 굳이 어셈블리어를 해석해보자

 

이 함수에서 쓰이는 어셈블리어 함수 종류

mov 두 번째에서 첫 번째로 데이터 이동
movzx 인자의 길이가 일치하지 않아도 이동
jmp 무조건 분기
cmp 두 인자 내용 비교(같으면 0)
call 프로시저 호출
je 결과 값 0이면 분기(이동)
xor 배타논리합(값이 달라야 1)

 

rcx에 있던 시행 횟수 값을 rsp+8에 이동시키고 

eax에 1 로드, imul로 rax와 0 곱한 값 다시 rax에 넣어준다

= for 문 형태

 

rsp+8에 있던 시행 횟수 값을 다시 rcx로 옮긴다

그리고 rcx+rax, 즉 입력값의 n번째 글자를 eax에 넣고

cmp 이용해 43(C)와 해당 위치에 있는 글자가 일치한지 확인해 같으면 0 리턴

je로 두 글자가 일치할 때 7FF6C~23 주소(다음 글자 비교하는 코드)로 이동하고

일치하지 않을 때는 xor로 같은 값 계산해서 eax(함수 반환값)에 0 로드하고

jmp, 무조건 분기로 함수를 끝내버린다

 

이 함수에서는 오른쪽에 대놓고 나와 있는 값들을 조합해서(Compar3_the_ch4ract3r) 입력값으로 들어오면

반환값으로 1을 설정해 correct를 프린트하게 만든다.

 

 

 

2. Ida 해석

프로그램을 시작하고 f5(디컴파일)를 누르면 나오는 화면

ida는 익숙한 C언어 형태로 디컴파일해줘서 x64dbg보다 훨씬 쉽게 해석할 수 있다

위의 코드를 봐도 correct를 프린트해주는 곳의 if문만 잘 보면 해결할 수 있을 것 같다는 생각이 든다

 

if 문 안에 있는 함수(sub_140001000)를 더블클릭하면 내부로 들어와진다

함수의 디컴파일 버전을 보니까 x64dbg보다 훨씬 이해하기 쉬운 형태를 보여주고 있다

위 함수는 여러번의 if 문을 반복하여 들어온 문자열과 코드가 원하는 문자열이

동일하다는 것을 확인해야 1을 리턴해주는 형태이다

 

 

 

 

정답: DH{Compar3_the_ch4ract3r}