2012-10-13 2 views
6

가능한 중복 : 나는이 클래스의 바이너리 폭탄 할당 일하고 있어요
What’s the purpose of the LEA instruction?
LEA instruction?문제 이해 조립 명령 "부하 효과 주소는"

그래서

은 (는 무리가 있습니다 프로그램의 어셈블리 코드를 단계별로 실행하고 "폭탄"을 디코딩 할 암호문을 찾는 단계).

lea 명령을 이해할 수 없어 현재 단계를 완료 할 수 없습니다. 나는 그것이 산술에 일반적으로 사용되는 것을 읽었지만, 나는 그것이 어떻게하는지 이해하지 못한다.

나는 특히 찾고 있어요 명령은, 그들은 프로그램이 계속 동일한 있다면

lea -0x18(%ebp), %ebx 
lea -0x8(%ebp), %esi 

는 비교 다음 라인 EAX와 EBX에

mov -0x4 (%ebx), %eax 
add -0x8(%ebx), %eax 

다음이다 그렇지 않으면 폭탄이 터진다.

나는이 단계에 대해 6 숫자가 필요하다는 것을 알기에 충분하다고 생각했다. 처음 두 개는 0과 1이다. 그 후 나머지 시퀀스가 ​​올바른지를 결정하기 위해 몇 가지 조작을한다. (나는 lea 명령은 다음 번호를 찾으려면 디코딩해야합니다.)

이제 내가 찾을 수없는 것은 특히 -0x18이 의미하는 것입니다. 음수 기호는 무엇입니까? 그것은 뺄셈을 나타 냅니까? ebp 전에 18 바이트를 찾고 있습니까?

도움을 주셔서 감사합니다.

답변

14

레아 명령은 MOV 명령을 사용하는 것과 같은 연산을 사용하는 메모리 주소를 계산한다. 그러나 MOV 명령어와 달리 LEA 명령어는 주소의 내용을로드하고 저장하는 대신 대상 레지스터에 계산 된 주소를 저장합니다.

lea -0x18(%ebp), %ebx 

이 명령은 -0x18의 합과 EBP 레지스터의 값을 계산 :

귀하의 첫 번째 LEA 명령을 고려하십시오. 결과 S를 얻습니다. EBX 레지스터에 S를 저장합니다.

가산 -0x18에서 "-"는 음수 부호이고 "0x"는 16 진수 상수임을 나타냅니다. 따라서 가수는 음수 18 이며 -24 입니다. 따라서이 LEA 명령은 EBP의 값에서 24를 단순히 빼고 그 결과를 EBX에 저장합니다. 하여 MOV 명령에

명암이 :

mov -0x4(%ebx), %eax 

이 명령어 -0x4의 합과 EBX 레지스터의 값을 계산한다. 그것은 결과 S를 얻습니다. 그리고 메모리의 주소 S에있는 단어의 값을 가져 와서 값 M을 얻습니다. M을 EAX 레지스터에 저장합니다.

1

LEA 명령어는 특정 주소 지정 모드로 평가 될 주소를 대상 레지스터에로드합니다. 두 케이스를 고려해

lea -0x18(%ebp), %ebx 
mov -0x18(%ebp), %ebx 

첫번째 명령 EBX에 EBP 오프셋 -0x18 상대 전류 값으로서 산출 어드레스를 로딩한다. 두 번째 명령어는이 주소의 메모리 내용을 ebx로로드합니다.

음수 오프셋은 위치가 레지스터의 주소보다 아래에 있음을 의미하고 양수 오프셋은 위치가 레지스터의 주소보다 위에 있음을 의미합니다. 또한 하단의 제로 어드레스와 메모리를 나타내는 것이 일반적이며, 주소는 도면에서 위쪽으로 성장 :

0xFFFFFFFC !_______! 
    .... 
+0x4(ebp) -> !_______! 
(ebp) ->  !_______! 
-0x4(ebp) -> !_______! 
    .... 
0x00000000 !_______!