반응형

Ghidra로 분석하면 아래와 같은 경고가 나오는 경우가 있다.

 

/* Warning: Call to offcut address within same funct: */

 

Replace.zip
0.01MB

 

 

디컴파일 윈도우에 경고가 표시된다.

함수 안의 다른 주소를 함수처럼 호출한다는 의미이다. 다른 프로그래밍 언어로 이런 개념의 코드를 작성하는 것은 이상하게 보이지만(함수 포인터 등을 이용하면 가능할 거 같기도 하다) 어셈블리 언어에서는 복잡하지 않게 작성할 수 있을거 같다. 이 디컴파일 내용의 어셈블리 명령을 살펴보자.

 

어셈블리 명령 윈도우

FUN_0040466f() 의 첫 번째 명령이 CALL LAB_00404674+6(0040467a) 이다. 잘 살펴보면 0040467a 라는 주소는 바로 아래 명령의 중간 부분이다. 뭔가 이상해서 첫 번째 그림에서와 같이 0040467a 호출 명령은 다른 함수들과 달리 소문자로 주석과 같은 분홍색으로 표시되는거 같다.

 

 

이 부분이 실제 어떻게 진행 되는지 x32dbg로 동적 분석을 진행해 보자.

지금은 00404674 주소에서 아래와 같이 명령이 구성되어 있다.

8105 D0844000 C7051660 add dword ptr ds:[4084D0],601605C7 

 

 

0040466F 에서 call replace.40467A 명령어가 실행되면 00404674 주소에 있는 명령의 중간부터 다시 해석되어 아래와 같이 명령이 바뀐다.

0040467A C705 16604000 EB609061 mov dword ptr ds:[406016],619060EB

 

 

이번엔 아래와 같은 경고를 살펴보자.

 

/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */

 

밑줄(_)로 시작하는 전역 변수(여기서는 함수의 이름을 말하는거 같다)가 덮어 씌어진다는 경고인거 같다.

 

 

두 개의 노란색 코드를 보면 _FUN_0040466f()를 덮어 쓰고 있다. 이 경우 함수의 내용이 바뀌게 된다. 그래서 경고를 하는거 같다.

 

 

_FUN_0040466F 를 0xC39000C6 으로 덮어 쓰는 부분이다. 이 명령 실행 전과 후를 비교해 보자.

 

실행 전 0040466F 의 명령이다.

 

 

실행 후 명령이 바뀐것을 볼 수 있다.

 

반응형
Posted by J-sean
: