문제

나는 실행 파일(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 보고에 대한 오프셋이 있습니다.

otx육 마 당신의 친구가 될 것입니다.otx 을 줄 것이 분해 파일-상대 오프셋과 육 악마에게 패치 밖으로 이동.는 것을 기억 0x90 이(86)사용자를 위한 NOP,그래서 9090909090 은 적절한 대체 fork()호출합니다.(하는 것을 명심하십시오를 생성하지 않을 것 반환 값 그래서 뭔가 이상한 끝낼 수 있습니다 eax.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top