2014-03-31 2 views
-1

바이너리 폭탄 프로젝트를 진행 중입니다. 이 코드를 작성 중이며 어셈블리 코드의 일부를 이해하려고합니다. 따라서 phase1을 쉽게 통과하고 2 단계에서는 4 문자를 입력해야합니다. 내가 국내 총생산 (GDP)이 실행하고 나는 다음을 얻을 어셈블리 코드를 검사 할 때 내 네 문자바이너리 폭탄 2 단계 어셈블리 코드 이해

을 같이 ABCD : 내가 입력을 사용 아래 phase-2: x y z d

예에서 예를 들면 다음과 같습니다

난 정말 무엇을 이해하는 무엇
Dump of assembler code for function phase2: 
    0x080487d6 <+0>: push %ebp 
    0x080487d7 <+1>: mov %esp,%ebp 
    0x080487d9 <+3>: sub $0xc,%esp 
=> 0x080487dc <+6>: mov 0x8(%ebp),%ecx 
    0x080487df <+9>: mov 0xc(%ebp),%edx 
    0x080487e2 <+12>: mov 0x10(%ebp),%eax 
    0x080487e5 <+15>: mov %cl,-0x4(%ebp) 
    0x080487e8 <+18>: mov %dl,-0x8(%ebp) 
    0x080487eb <+21>: mov %al,-0xc(%ebp) 
    0x080487ee <+24>: cmpb $0x77,-0x4(%ebp) 
    0x080487f2 <+28>: jne 0x8048807 <phase2+49> 
    0x080487f4 <+30>: cmpb $0x62,-0x8(%ebp) 
    0x080487f8 <+34>: jne 0x8048807 <phase2+49> 
    0x080487fa <+36>: cmpb $0x79,-0xc(%ebp) 
    0x080487fe <+40>: jne 0x8048807 <phase2+49> 
    0x08048800 <+42>: mov $0x1,%eax 
    0x08048805 <+47>: jmp 0x804880c <phase2+54> 
    0x08048807 <+49>: mov $0x0,%eax 
    0x0804880c <+54>: leave 
    0x0804880d <+55>: ret  
End of assembler dump. 

0x080487ee <+24>: cmpb $0x77,-0x4(%ebp) 
입니다

여기 무슨 일 이니? 나는 $ 0x77 값을 ebp 값과 비교한다고 생각한다. 말이 돼? 언제 어떻게 ebp에 저장되어 있는지 알 수 있습니까?

나는 위의 라인까지의 코드까지를 실행하고 EBP와 나는 다음과 같은 얻을 :

그래서
ebp   0xbffff6e8 0xbffff6e8 

을 요약하기, 난 그냥 그렇게, 그 라인이 정말하고있다 비교 알고 싶어 I 코드를 조금 더 잘 이해할 수 있습니다. 그리고 ebp에서 그 가치가 휴가 상태로 가지 않고 어떻게되는지 알아낼 수 있습니다.

답변

1

%ebp이 - -0x4%ebp에 저장된 어드레스로부터 오프셋 - 아래의 값 (음의 옵셋) %ebp 위에서 일반적 로컬 (C 코드에서 컴파일하는 경우) 변수 및 값은 (양수 오프셋)은 대개 함수 매개 변수입니다. 이 코드는 C 코드를 컴파일하여 생성 된 것으로 보이며 %ebp 사용법이 일반적입니다. -0x4(%ebp)은 함수의 첫 번째 지역 변수를 나타냅니다.이전에 몇 가지 진술을 mov %cl,-0x4(%ebp)으로 설정 한 것 같습니다. 이는 %cl 값의 값이 어디에서 왔는지에 대한 질문을 제기합니다. 그리고 더 자세히 추적하면 이라는 mov 0x8(%ebp),%cx이라는 것을 알 수 있습니다. cmpb 명령어는 b이라는 접두사가 붙습니다. 즉, 바이트 비교입니다. (16 비트 또는 32 비트 비교와 반대). 이는 8 비트 값인 %cl만을 사용하여 설정 한 값과 일치한다는 것을 알 수 있습니다.

이 모든 것은 요청한 행이 16 진수 값 0x77과 8 비트 비교를하고 있음을 나타냅니다. ASCII 테이블을 보면 0x77이 소문자 'w'임을 알 수 있습니다. 다음 명령어는 바이트가 그 값과 같지 않으면 점프합니다. 이것은 함수에 전달 된 첫 번째 매개 변수가 'w'문자인지 확인하는 것으로 결론 내릴 수 있습니다.

0

제가 아는 한,이 폭탄은 일반적으로 학생들에게 주어집니다. 나는 당신이 이미 배워야 만했던 기본 지식을 놓치고 있다고 느끼고 있습니다. 자신이 갖고있는 교재를 다시 읽어야합니다. 어쨌든

, 몇 가지 빠른 힌트 :

  • x(%ebp)가 간접 주소입니다, 그것은 x+%ebp
  • 함수 인수가 스택에 전달되는 주소의 메모리를 액세스합니다. %ebp부터 라인 +1 후 내용을 스택 : saved ebp, return address, arg1, arg2, arg3
  • 라인 +6 부하 8(%ebp)%ecx로 (첫 번째 인수 인).
  • 라인 +15은이 하위 8 비트를 -4(%ebp)에있는 로컬 변수에 저장합니다.
  • 라인 +24은이 값을 0x77과 비교합니다.

네 개의 숫자가 필요하다고 주장합니다. 호출자에서 이것이 사실 일 수 있지만이 phase2은 3 개의 인수 만 사용합니다. 일반적으로 스택 프레임 포인터로서 이용