1. 문제 요약
바이너리가 레지스터에 반환하는 값을 디버깅으로 찾는 문제이다.
출력문이라면 디버깅을 하지 않고도 문자열만을 검색하여찾을 수 있지만,
바이너리가 해당 문자열을 레지스터에다가 반환하기 때문에 디버깅 사용은 필수이다.
2. 문제 풀이
GDB 디버거 연결
우선 기본적으로 바이너리를 디버거로 열어준다.
이렇게 열어줘야 정상적으로 열린다. (나는 처음에 모르고 위에 Tool Chest에 있는 Debugger를 눌렀더니 계속 빈 프로젝트 파일만 오픈이 되었다.)
그 후에 디버거 메뉴에서 GDB LOCALLY IN-VM을 열어 디버거를 우분투의 GDB와 연결시켜준다.
그러고 일단 starti 메뉴를 체크하고 실행을 시켜준다. 여기까지가 항상 기본 작업이다.
브레이크 걸기
가장 먼저 해주어야 할 것은, 동기화이다.
Ghidra 화면의 왼쪽에 Objects 메뉴가 보일텐데, 거기서 Module를 클릭해 디버거와 동기화를 시켜주어야
Breakpoint를 걸어도 잘 걸린다. 이것 땜에 좀 애를 먹었다. 그리고 중단점은 문자열 찾기를 통해 대충 멈춰야 할 지점을 지정해 준다.
Byte Viewer 확인
실행하다 보면 아래와 같은 위치에 있을 때, 바이너리가 RAX라는 레지스터에 데이터를 보낸다는 것을 알 수 있다.
그러면 그 때의 RAX에는 ram에 적재된 바이너리에서 0x405750 위치에 있는 문자열이 올라와 있으므로
이 때 Byte Viewer Memory를 열어 Go 입력창에서 주소 0x405750: 4 로 이동해주면
아래와 같은 아스키 값을 볼 수 있으며, 해당 플래그를 드림핵에 입력해주면 정답을 맞출 수 있게 된다.