드림핵에서 풀어보는 첫 리버싱 문제이다. 열심히 해보자.
일단 문제 파일을 다운받아주고 시작해 보자.
일단 문제 정보만 보았을 때, correct를 출력하는 입력값을 찾는 문제인 것 같다. 다운받은 압축파일을 까 보니,
일단 x64 디버거를 실행해서 위 파일을 실행해 보자.
문자열 찾기 기능을 이용하여, correct 문자열이 들어간 주소를 찾았다.
어셈블리어를 아직까지 완벽히 번역하지는 못하지만, 대충 흐름을 파악하자면 input으로 값을 받고, correct인지 wrong인지 판단하는 문제인 것 같다.
text eax, eax가 있는 걸 보아하니, 바로 위에서 함수를 불러 입력값을 받아 비교하는 것으로 보인다. 어셈블리어 조금 더 공부해야겠다....😂
위의 함수의 위치로 가 보니,
플래그가 있었다. 아직 x64 디버거를 잘 활용하지 못하다 보니, 조금 찍어맞춘 감이 없잖아 있다..😅 다음에는 조금 더 숙련되서 오도록 하겠다.
두번째 문제이다. 이 문제는 위에서 푼 문제와 비슷하다. correct를 출력하는 함수를 찾는 문제이다.
일단 문제 파일을 다운받고, x64 디버그로 파일을 까 보자.
위에서 풀어본 문제와 비슷한 문제이다. correct를 출력하는 입력값이 무엇인지 알아내서 플래그를 찾는 문제이다. 일단, 문자열 찾기를 통해 correct 문자열을 찾아 보자.
근처에 input 주석이 보인다. 그리고 위와 같이 test 명령어도 보인다. test 명령어는 입력받은 두 값을 비교하는 명령어로, 바로 위의 call로 불러낸 함수가 input으로 입력한 값을 받는 함수라고 추정할 수 있다.
한번 함수가 있는 곳으로 찾아가 보자.
?? 무언가 문자열이 보인다. 문자열을 조합해 보니
'compar3_the_ch4ract3r' 이라는 문자열이 나온다. 매우 플래그스럽다.
정답창에 문자열을 입력했더니, 정답이다.
세번째 문제이다.
마찬가지로, correct를 출력하는 함수부터 찾아보자. 파일을 다운받고 x64로 파일을 까 보자.
문자열 찾기로 correct가 들어간 줄을 찾는다.
test eax, eax 명령의 위에 있는 함수가 입력값을 받는 함수인 것으로 추정된다. 한번 함수의 위치로 가보자.
위의 문제들과 달리, 바로 플래그 값이 보이지 않는다. 일단 명령어를 해석하고 어디에 플래그 값이 숨겨져 있을지 찾아보자.
mov qword ptr ss:[rsp+8], rcx -> rsp + 8 주소의 값에서 8바이트 주소의 값을 rcx로 바꾸기
sub rsp, 18 -> rsp의 값을 18만큼 감소시킨 다음 rsp에 저장(스택에 공간을 할당)
mov dword prt ss:[rsp], 0 -> rsp 주소의 값에서 4바이트 주소의 값을 0으로 바꿈
jmp chall2.7FF7B6FE101A -> chall2.7FF7B6FE101A로 점프
mov eax, dword ptr ss:[rsp] -> eax에 rsp 주소 값 넣기
inc eax -> eax의 값에서 1만큼 증가
mov dword ptr ss:[rsp], eax -> rsp 주소의 값에서 8바이트 주소 값을 eax로 바꾸기
movsxd rax, dword ptr ss:[rsp] -> 해석못함.....rax에 rsp의 값을 넣는건가?
cmp rax, 12 -> rax와 12를 비교함
jae chall2.7FF7B6FE1048 -> rax가 12와 같거나 크면 chall2.7FF7B6FE1048로 점프
movsxd rax, dword ptr ss:[rsp] -> 마찬가지.....어셈블리어 열심히 공부하고 돌아오겠음
lea rcx, qword ptr ds: [7FF7B6FE3000] -> [7FF7B6FE3000]의 값에서 8바이트의 주소 값을 rcx에 저장
어셈블리어를 번역해 보면, rcx의 값에 [7FF7B6FE3000]의 값이 저장된 것을 확인할 수 있다. 한번 [7FF7B6FE3000]의 주소 값으로 이동해 보자. 이 때는 덤프에서 따라가기로 해당 주소 [7FF7B6FE3000]로 바로 이동해서 확인할 수 있다.
아스키 값을 보면, 플래그 값이 나와있다.
정답