2012-04-27 3 views
1

이제는 EIP 레지스터에서 기계 명령어 '주소가 있습니다. 이 머신 명령어는 메모리의 특정 영역의 값을 변경할 수 있습니다.하지만이 메모리의 주소를 가져올 수는 없습니다.하나의 기계 명령어가 쓰는 주소를 얻는 방법?

물론 컴퓨터 명령어 'address '에서 데이터를 읽을 수는 있지만 내용은 다음과 같은 기계 명령어입니다 : 0x8b0c4d8b ...... 읽을 수 없습니다 (gdb와 같은 디버깅 도구를 사용할 수 없음).

한 기계 명령어가 쓸 주소를 얻는 방법은 무엇입니까? 당신의 머신 코드 EIP 점을 알고 당신은 단지 그것을 분해 같은 것을 할하려면

+1

디버거 사용 - 해당 명령어의 주소에 중단 점을 설정 한 다음 중단 점에 도달 할 때 EIP를 검사합니다. –

+0

하지만 EIP가 수업의 주소입니다. 맞습니까? 나는 아직도이 지시가 쓸 주소를 얻을 수 없다. – zsounder

+0

@PaulR misspoke라고 생각합니다. 그럼에도 불구하고 디스어셈블러 (또는 하나가 내장 된 도구)를 사용하거나 x86 opcode를 분해하는 방법을 알고있는 도구를 직접 작성해야합니다. – geekosaur

답변

1

(나는 0x8b0c4d8b 당신의 예를했다) :이 경우에, 그래서

 
#create binary file 
$ echo -en "\x8b\x0c\x4d\x8b" > foo.bin 

#disassemble it 
$ objdump -D -b binary -m i386 foo.bin 

foo.bin:  file format binary 


Disassembly of section .data: 

00000000 : 
    0: 8b      .byte 0x8b 
    1: 0c 4d     or  $0x4d,%al 
    3: 8b      .byte 0x8b 

을, 그것은 '아무튼 메모리 위치를 변경하지 마십시오. 그렇다면 어셈블리 코드에서 쉽게 볼 수 있습니다.

편집 : 프로그래밍 방식으로이 작업을 수행하려는 것으로 보입니다. udis86을보십시오. 그것은 지시의 examining operands를 허용합니다. ARM의 경우 disarm을 참조하십시오.

+0

Ooops 죄송합니다. 샘플 0x8b0c4d8b는 좋지 않습니다. – zsounder

+0

그러나 하드 코드 된 주소 (즉, 레지스터 기반 주소 지정과 관련이없는 경우)에서는 일반적으로 작동하지 않습니다. 신뢰할 수있는 유일한 방법은 디버거에서 코드를 실행하고 관련 레지스터를 검사하는 것입니다. . –

+0

@PaulR : 네, 압니다. 나는 OP가 그가 디버거를 사용할 수 없다고 언급했기 때문에이 대답을 주었다. – Job