1. 문제 이해
해당 프로그램을 실행시켰을 때 플래그가 출력되지 않고 숨겨져 있음을 알 수 있다.
그래서 디버거를 사용하여 출력 함수 다음으로 실행되는 함수가 어떤 데이터를 갖고 있는지 알아내야 한다.
2. 문자열 검색
Below function takes the flag as an argument :) 는 그냥 봐도 20바이트는 넘기 때문에
문자열 검색의 minimum 값을 20으로 설정하고 찾아본다.
3. 문자열 참조
그러면 우리가 찾고자 했던 문자열의 위치로 이동할 수 있고,
문자열이 쓰여 있는 곳이 곧 메인 함수이기 때문에
우리는 문자열 참조를 하여 메인 함수의 위치로 이동할 수 있다.
4. 디버깅
디컴파일된 메인함수를 보면 출력 함수 밑 부분에 FUN_004015e2 라는 함수가
어떤 데이터를 매개변수로 가지고 있음을 알 수 있다.
이 데이터가 어떤 값을 가지는지 알기 위해서는 해당 함수에 중단점을 설정하고 디버깅을 시작해야한다.
디버깅을 시작하면 rip는 해당 함수 위치로 설정된 것을 보아
중단점에 잘 멈춘것을 알 수 있었다.
해당 함수의 매개변수는 rdi 레지스터에 저장되기 때문에
rdi에 저장되어있는 0x405340 위치의 데이터를 찾아야 한다.
5. Byte viewer
그래서 Byte viewer로 해당 위치를 입력해주면 해당 위치로 이동하면서 아스키 값을 볼 수 있다.
플래그는 DH{64db030352ca9f9f5e6d8a59c0527bee} 인 것을 알 수 있다.
궁금한 점
디버거 만을 사용하여 찾을 수 있는 것이지 궁금하고,
왜 버추얼 박스에서만 화질이 깨지지 않고 돌아가는지 궁금하다.
처음에 VMware에서 실행했을 경우에는 프로그램이 깨져서 디버깅하기 어려웠다.
또, 버추얼 박스도 너무 속도가 느리고 속도가 빨라지는 설정을 하면
다시 기드라 프로그램이 깨져있고, 속도 빨라지는 설정 대신 화면 화질을 높이는 설정을 하면
화면이 지지직 거려서 할 수 없이 UI가 커진 기드라를 사용할 수 밖에 없었다.
+ 본인은 기드라 10.2.3 버전을 사용했고 jdk 17, gdb 12.1 을 적용하여 디버깅하였다.