2013-03-08 3 views
0

나는 GDB에서 'passphrase'와 프로그램 입력을 비교하는 것과 관련된 함수를 사용하지 않는다. 나는 실제 암호문이 $ eax에 있음을 알고 있지만 $ eax를 조사하려고 할 때 그 주소가 범위를 벗어난 오류를 얻는다. $ eax를 조사하기 위해 무엇을 할 수 있습니까?

Dump of assembler code for function s: 
    0x08048444 <+0>:  push %ebp 
    0x08048445 <+1>:  mov %esp,%ebp 
    0x08048447 <+3>:  mov 0x8(%ebp),%edx 
    0x0804844a <+6>:  mov $0x0,%eax 
    0x0804844f <+11>: cmpb $0x0,(%edx) 
    0x08048452 <+14>: je  0x804845d <s+25> 
    0x08048454 <+16>: add $0x1,%eax 
=> 0x08048457 <+19>: cmpb $0x0,(%edx,%eax,1) 
    0x0804845b <+23>: jne 0x8048454 <s+16> 
    0x0804845d <+25>: pop %ebp 
    0x0804845e <+26>: ret 
+1

당신은'x $ edx'를 사용하고 있다는 것을 의미합니까? 'p $ edx'는 뭐라고 말할까요? –

+0

질문을 다시 작성합니다. 미안합니다. 질문은 실제로 $ eax에 관한 것입니다. – theman

+0

그리고 x $ eax를 사용하고 있습니다. '0x1 : <0x1 범위 외> ' – theman

답변

1
cmpb $0x0,(%edx,%eax,1) 

수단는 "edx + eax * 1에서 바이트 0 비교".

당신은 EDX (p/x $edx) EAX (p/x $eax) 주소 지정하는지 바이트 볼 볼 필요가있다.

+0

SIB 바이트에서 % edx가 기본 레지스터로 사용될뿐만 아니라 함수의 시작 부분에서 % eax가 명시 적으로 0으로 설정되고 % edx는 함수 인수 인'0x08048447 <+3> : mov 0x8 (% ebp), % edx; 0x0804844a <+6> : mov $ 0x0, % eax'. – mkfs

1

패스워드는 EAX 대신 EDX입니다. 따라서 null로 끝나는 문자열의 내용을 보려면

(gdb) p (char*)$edx 

을 실행하십시오.

코드가 그것으로 함수의 첫 번째 인수를 이동하기 때문에 당신은 EDX를 원하는 것을 알 수 있습니다 : 인덱스로 사용

0x08048447 <+3>:  mov 0x8(%ebp),%edx 

및 EAX 때문이다. 그것은 먼저 루프에 1 씩 증가, 0으로 설정 : 0 (%edx,%eax,1)을 비교 한 후 코드가 다시 점프하는 방법

0x0804844a <+6>:  mov $0x0,%eax 
<...> 
0x08048454 <+16>: add $0x1,%eax 
0x08048457 <+19>: cmpb $0x0,(%edx,%eax,1) 
0x0804845b <+23>: jne 0x8048454 <s+16> 

참고 EAX를 증가 할 수 있습니다.

관련 문제