IDA "sp-analysis failed" 에러 해결 방법
함수를 디컴파일하는 과정에서 JUMPOUT()이 뜨면서 디컴파일이 정상적으로 안되는 경우가 있습니다.
이번 포스트는 이런 에러를 해결하고 함수를 정상적으로 디컴파일하는 방법을 소개합니다.
asm 코드를 보면 "endp ; sp-analysis failed"라는 오류가 발생하면서 디컴파일이 수행되지않습니다.
해당 오류는 스택 포인터가 잘못 설정된 경우에 발생하는데요. 따라서 스택 포인터를 정상적인 값으로 다시 설정하면 오류를 해결할 수 있습니다.
다만, 필자는 스택 포인터를 바꾸는 방법으로 오류를 해결할 수 없었습니다.
여러가지 방법을 시도했지만, 전부 실패하고 함수를 재정의하는 방법만 성공했습니다. 따라서 함수를 재정의해서 정상적으로 디컴파일하는 방법을 공유하겠습니다.
먼저, 오류가 발생한 "endp ; sp-analysis failed"에서 [오른쪽 마우스]를 누르고 함수를 [undefine]합니다.
undefine하면 asm 코드가 데이터로 표현됩니다.
처음에 디컴파일한 결과에 나타나는 함수명을 보면 offset은 0x1308이라는 것을 알 수 있습니다.
0x1308부터 코드가 재정의되도록 0x1308에 마우스 커서를 올리고 [오른쪽 마우스] → [Code] 순으로 클릭합니다.
0x1308을 시작으로 asm 코드가 재정의된 것을 확인할 수 있습니다.
다음으로 [Create function] 클릭해서 함수를 재생성합니다.
_BYTE *__fastcall sub_1308(int a1, __int64 a2)
{
_BYTE *result; // rax
_BYTE v3[16]; // [rsp-8h] [rbp-10h]
*(_DWORD *)&v3[-4] = a1;
*(_QWORD *)&v3[-16] = a2;
**(_WORD **)&v3[-16] = *(_DWORD *)&v3[-4];
*(_BYTE *)(*(_QWORD *)&v3[-16] + 2LL) = BYTE2(*(_DWORD *)&v3[-4]);
result = (_BYTE *)(*(_QWORD *)&v3[-16] + 3LL);
*result = HIBYTE(*(_DWORD *)&v3[-4]);
return result;
}
함수 생성 후, [F5]를 눌러서 디컴파일하면 코드가 정상적으로 출력됩니다.
간혹 재정의한 함수를 호출하는 부분을 보면, 함수 인자가 정상적으로 디컴파일 되지 않는 경우가 있습니다. (지금은 정상적으로 인자가 표현된 경우입니다.)
이 경우 &sub_1308+1를 호출하고 있습니다.
재생성한 함수는 sub_1308이므로 [Assemble instruction] 기능으로 호출 함수의 offset을 맞춰서 편집해줍니다.
코드를 다시 확인해보면 함수 호출이 정상적으로 표현되는 것을 확인할 수 있습니다.
지금까지 IDA sp 관련 오류에 대해서 알아봤습니다.
다들 즐거운 리버싱 하시길~~!!