티스토리 뷰

최종 수정: 2014-02-25


안녕하세요. Hackability 입니다.


오늘 포스팅 할 내용은 IDA에서 디컴파일시 발생하는 "positive sp value has been found" 에러에 대한 내용입니다.


IDA에서 F5를 통해 디컴파일시 다음과 같은 에러 메시지가 발생할 수 있습니다.



위 내용은 스택 포인터가 양수 값을 갖는다는 에러 인데요. 스택 메모리 구조 상 지정된 주소는 초기 스택 포인터 보다 낮은 주소에 있어야합니다. (보통 변수를 선언하면 sub esp, 10h 등과 같이 말이죠)


그러므로, 이 에러 메시지가 뜨는 이유는 지정된 주소가 초기 스택 포인터보다 큰 주소에 있기 때문에 발생하는 에러 메시지 입니다.


먼저 예제를 확인해보도록 하겠습니다. 제가 디컴파일 에러가 발생한 위치는 다음과 같습니다.



그런데 이렇게 보면 스택 포인터의 위치를 찾기 어렵기 때문에 [Option] -> [General] 으로 들어 간 뒤, Display disassembly line parts 에서 Stack pointer를 체크해줍니다.



그러면 다음과 같이 화면 왼쪽에 스택 포인터 변위에 대해 확인할 수 있습니다.



위에서 보시면 text:0040116F위치에서 -58 값을 확인하실 수 있습니다. 이 부분에서 에러가 발생하는데요. 이 위치의 명령은 sub esp, 80h 입니다. 이 명령의 윗 부분인 add esp, 80h로 올라가서 [Alt + k] 를 누르면 다음과 같은 창이 나타납니다.


여기서 우리가 해야 할 것은 -58 의 값을 최소 0 이상으로 맞춰야 합니다. 정확하게 스택 포인터를 맞추려면 전후 사정을 모두 파악해야 하지만 그렇기 힘들기 때문에 추후에 코드 변경이 생길 수 있습니다. 저의 목적은 저 코드를 디컴파일 하는 것이기 때문에 일단 스택의 변위를 맞춰보도록 하겠습니다.


Current SP value가 -0x28 로 나와 있기 때문에 입력 값을 0x28 로 입력하고 ok 를 누르면 다음과 같이 sub esp, 80h의 위치의 스택 포인터가 00 으로 변경됨을 알 수 있습니다.



그리고 F5를 누르시면 소스 코드가 정상적으로 나오는 것을 확인하실 수 있습니다.


댓글