문제 파일을 다운로드받고 압축을 풀어준다
1. x64bug 해석
본 함수의 코드들인데 여기에서 주목해야 할 점은 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 해석
ida는 익숙한 C언어 형태로 디컴파일해줘서 x64dbg보다 훨씬 쉽게 해석할 수 있다
위의 코드를 봐도 correct를 프린트해주는 곳의 if문만 잘 보면 해결할 수 있을 것 같다는 생각이 든다
함수의 디컴파일 버전을 보니까 x64dbg보다 훨씬 이해하기 쉬운 형태를 보여주고 있다
위 함수는 여러번의 if 문을 반복하여 들어온 문자열과 코드가 원하는 문자열이
동일하다는 것을 확인해야 1을 리턴해주는 형태이다
정답: DH{Compar3_the_ch4ract3r}
'dreaMhack > Reverse Engineering' 카테고리의 다른 글
[드림핵] rev_basic_4 풀이/어셈블리어 해석 (0) | 2022.03.23 |
---|---|
[드림핵] rev_basic_3 풀이/어셈블리어 해석 (0) | 2022.03.23 |
[드림핵] rev_basic_0 풀이/어셈블리어 해석 (0) | 2022.03.23 |
[드림핵] 리버싱 레지스터 용도 정리 (0) | 2022.03.23 |
[드림핵] Reverse Engineering Introduction(리버스 엔지니어링 소개) (0) | 2022.03.03 |