아래의 강의를 수강하게 되었다. 드림핵 > 리버싱 > Ghidra 강의이다. 유료인데, 22,000으로 기억한다. 드림핵이라면 강의의 질은 문제없을 거라고 생각했고, 그래서 바로 구매하게 되었다!
강의에서 다룬 한 문제를 블로깅하려고 한다. 문제 링크는 아래에 있고, 직접 문제 파일을 다운로드 받아서 풀어볼 수 있다.
어제는 Ghidra를 설치만 해봤는데, 오늘은 처음으로 실행을 해보고 파일을 올려서 풀어보았다.
Ghidra를 실행한 후 File > New Project를 선택한다.
Ghidra에서 분석된 파일이 담길 경로와 폴더 이름을 적는다.
초록색 용 아이콘을 클릭한다. 그럼 용이 엄청 커지는 애니메이션이 발생하며 분석창이 열린다.
File > Import File을 클릭한다.
링크에서 미리 다운로드받은 문제 파일을 선택한다.
포맷, 언어 등이 자동으로 분석되어 설정된다.
자동으로 분석할까요? > Yes를 누른다.
아래는 분석 옵션이다. 가능하면 모두 선택하는 것이 좋으나, 빨간색 글씨는 오류가 생길 수 있어 선택하지 않는 것이 좋다고 한다.
문제 파일을 열어보았다. ELF형식은 mac에서는 안열리는 것 같아서 OrbStack 프로그램을 사용하여 실행시켜보았다.
한글 혹은 영어를 입력하면 0 is wrong x(
가 나오고 숫자를 입력하면 몇진수의 숫자가 출력된다.
메뉴에서 Search > For Strings으로 들어간다.
10글자 이상의 "Strings"를 검색한다. 바이너리 파일에서 사람의 눈으로 식별할 수 있는 문자열을 모두 검색한다는 뜻같다.
Filter에 검색하고자 하는 문자열 is wrong x(
를 입력하면 라인 한개가 뜬다. 클릭하고 창을 닫아준다.
is wrong x(
가 있는 부분의 주소에서 오른쪽 마우스 클릭 > References > Show References To Address를 클릭한다. 이 주소를 참조하고 있는 부분을 보여달라는 뜻같다.
두 라인이 뜨는데, PARAM이라고 되어있는 라인을 클릭하고 닫는다.(인자로 받아서 결과를 출력하는 부분을 알고싶기 때문에 PARAM이라고 쓰인 라인을 선택한다고 한다.)
화면으로 돌아갔을 때, 이렇게 세부분이 보였다. 첫번째는 비교하는 구문 CMP가 보였고, 그다음에는 x_is_wrong_x(
라는 문자열이 보였고 그 다음으로는 오른편의 코드가 보였다. 코드를 보니 0x13371337
이면 Correct!
를 출력하고 아니면 ~is wrong
을 출력하는 것 같았다.
강의에서 본 풀이를 정리해보면, 아래와 같다.
bool FUN_00401ad5(void)
{
long in_FS_OFFSET;
bool bVar1;
int local_14;
long local_10;
local_10 = *(long *)(in_FS_OFFSET + 0x28);
// local_14를 0으로 초기화
local_14 = 0;
// FUN_0040bb20는 scanf함수 -> 어떻게 scanf함수인지 알 수 있는지 모르겠다. 함수 내용을 봐도 전혀 모르겠던데...
FUN_0040bb20(&DAT_004b6004,&local_14);
// bVar1 : 비교 결과를 저장하기 위한 불리언 변수.
// 입력받은 값이 0x13371337이면 bVar1은 1(참), 아니면 0(거짓)이 됨
bVar1 = local_14 != 0x13371337;
if (bVar1) {
// bVar1이 0이면(거짓이면)
FUN_0040b990("%x is wrong x(\n",local_14);
}
else {
// bVar1이 0이 아니면(참이면)
FUN_0041a400("Correct!");
}
if (local_10 != *(long *)(in_FS_OFFSET + 0x28)) {
/* WARNING: Subroutine does not return */
FUN_0045a420();
}
return bVar1;
}
IDA에서는 16진수를 클릭하고 h를 누르면 10진수 등으로 변환해줬던 것 같아서 오른쪽 마우스를 클릭해보았다. 10진수(Decimal)값이 보였다! 클릭해보았다.
CMP EAX, -> 이부분이 원래 16진수였는데 10진수로 변환된 것을 알 수 있었다. 결국 322376503
를 넣어야 정답이 출력되는 것이었다.
322376503
를 입력하였고 Correct가 출력되었다!🤓