어떻게 확인할 수 있습니의 위치 분해 코드에서 실행?
-
22-07-2019 - |
문제
나는 실행 파일(C++,i386,에서 컴파일 MacOS X/호랑이,중요한 경우)을 포함하는 버그입니다.에 대한 수정 버그는 간단하 있는 장소에 코드를 호출 fork()그리고 안됩니다.기 때문에 수정이 간단하며,다시 컴파일하기 때문에 실행파일 처음부터 어려울 것이 이 시점에서(요청 하지 않),는 패치를 실행/바이너리 파일이 직접 있습니다.
첫 번째 단계로 향하는,내가 실행"otool-tV MyExecutableName"에서 실행 파일이며,여기에,나는 이것에서 분해 출력:
./MyExecutableName:
(__TEXT,__text) section
[... many lines omitted ...]
0002ce0d subl $0x10,%esp
0002ce10 calll 0x0051adac
0002ce15 movzbl 0x14(%ebp),%esi
0002ce19 calll 0x00850ac9 ; symbol stub for: _fork
0002ce1e cmpl $0x00,%eax
0002ce21 jll 0x0002cf02
0002ce27 jle 0x0002ce34
[... many more lines omitted ...]
그래서 무엇을 하고 싶은 대체 코드 라인에서 0002ce19,그래서 대신의 통화'ing_fork,그것은 단순히 점프 무조건적으로 실패한 경우(i.e그것처럼 행동 fork()가 반환됩 -1)
불행하게도,나는 완벽한 초보자에서 분해/바이너리 패치,그래서 나는 확실하지 않는 방법에 대해 이동하는 것입니다.특히,제 질문은:
1)What 바이트다가 써야에 위치 0002ce19 을 통해 0002xe1d 무엇을 얻을까?나는 가정이 될 것이라 조립 상당의"jmp0x0002cf02"하지만,나는 어떻게 그 어떤 사람들은 바이트는?
2)오프셋 인쇄에 의해"otool-tV"나타나는 것으로 오프셋__텍스트의 세그먼트를 실행 파일을 실행합니다.어떻게 확인할 수 있는 바이트 사이에 인쇄 오프셋 및 상단의 파일할 수 있도록 수정/패 올바른 바이트 파일 내?
감사에 대한 조언을 제공할 수 있습!
해결책
나는 익숙하지 않 MacOS/X 그러나 내가 줄 수 있어요.
적절한 방법으로,그것을 해결하기 위해 사용하는 것입어 패치 파일을.
0002ce19 calll 0x00850ac9
대체될 수 있으로
0002ce19 movl eax, -1 ; mov eax, 0xFFFFFFFF
오프셋이 당신이 볼 수은 상대적이,그래서 당신은 찾을 수 없습니다 그들에 파일입니다.
예를 들어, jll 0x0002cf02
실제로 jll 0x000000DF
면 내가 올바른지,아래 코드 블록
0002ce19 calll 0x00850ac9 ; symbol stub for: _fork
0002ce1e cmpl $0x00,%eax
0002ce21 jll 0x0002cf02
0002ce27 jle 0x0002ce34
이 조립되는 형태(20bytes):
0x E8 AB3C8200
83F8 00
0F8C DF000000
0F84 0B000000
는 경우에는 순서가는 독특한 파일에 다음을 시도할 수 있습을 변경할 E8AB3C8200
하기 B8FFFFFFFF
, 는 경우 사용할 수 없습니다 안전하게 삭제할 수 있습니다.
다른 팁
아마 가장 쉽게를 넣어하는 것입 mov $-1, %eax
의 장소에서 호출합니다.당신은 무엇을 찾을 수 있습니다 바이트는 해당하여 그것을 지지 않습니다.s 파일을 컴파일하고,투기 결과,패딩과 함께 nops 면 그것보다 짧은 패치 위치에 있습니다.I get"b8ff ff ff",는 그냥합니다.
을 찾을 수 있습의 시작 __TEXT
실행 otool -l
보고에 대한 오프셋이 있습니다.