2015-02-07 7 views
0

할당은 일부 어셈블리 코드를 해석하여 "폭발 폭탄"을 호출하지 않고 실행할 구를 찾습니다. gdb를 사용하여 현재 단계를 디스 어셈블리합니다. 나는 갇혀있어 내가 올바른 방향으로 움직이고 있는지에 대한 조언은 매우 감사 할 것입니다. 해체하려고 시도합니다

0x0000000000400fb5 <+0>: sub $0x18,%rsp   
0x0000000000400fb9 <+4>: lea 0x8(%rsp),%r8 
0x0000000000400fbe <+9>: lea 0xf(%rsp),%rcx 
0x0000000000400fc3 <+14>: lea 0x4(%rsp),%rdx 

나는 무엇 일어나는 것은 우리가 %의 RSP (기본 포인터가 가리키는 것)의 문구를보고있는 것을 믿습니다. 나는 네 가지가 메모리에 저장되어 있다고 생각한다. (% rsp), 0x4 (% rsp), 0x8 (% rsp), 그리고 0xf (% rsp)로 3 개의 정수와 다른 것으로 생각한다. 물론.

0x0000000000400fc8 <+19>: mov $0x4028f6,%esi   

주소 $ 0x4028f6의 값은 "% d % c % d"입니다. % esi를 등록하기 위해 이동 중임을 알고 있지만, 이것이 어떻게 사용되고 있는지 확실하지 않습니다.

0x0000000000400fcd <+24>: mov $0x0,%eax    
0x0000000000400fd2 <+29>: callq 0x400c80 <[email protected]> 

여기 무슨 일인지 잘 모르겠습니다. 나는 0x400c80에보고하고 다음 발견

0x0000000000400c80 <+0>: jmpq *0x20340a(%rip)   
0x0000000000400c86 <+6>: pushq $0x12 
0x0000000000400c8b <+11>: jmpq 0x400b50 

내가 % 립이 레지스터로 사용되는 표시되지 않습니다를, 그래서 내가 할 또는 어디 있는지하는 것이 무엇인지 확실히 모르겠어요. 나는 그것이 % eax에 0x12를 놓고 있다고 생각하지만 0x400b50이 유효한 주소가 아니기 때문에 어디서 점프하는지 확신 할 수 없다. 어쨌든, 다시 원래의 기능 :

0x0000000000400fd7 <+34>: cmp $0x2,%eax    
0x0000000000400fda <+37>: jg  0x400fe1 <phase_3+44> 
0x0000000000400fdc <+39>: callq 0x401719 <explode_bomb> 

나는 우리가 단지 %의 EAX에 0x18을 밀어 생각, 그래서 그것은 확실히 0x2로보다 큰 수 있습니다 및 프로그램이 "폭탄 폭발"건너 것입니다. 나는 그 지점까지 내가 어디까지 망쳐 놓고 있는지 알고 싶다.

답변

0

불행히도 중요한 지식이 누락 된 것처럼 보입니다. 자신이 가지고 있지 않은 자료를 다시 찾아야합니다. 나머지 과제는 실제로 덜 복잡 할 것입니다. 말했다

, 지금까지 만 인용 한 블록은 다음을 수행합니다

int x, y; 
char c; 
if (sscanf(foo, "%d %c %d", &x, &c, &y) <= 2) explode_bomb(); 

첫 번째 블록은 3 개 로컬 변수를 할당, 그리고 각각의 sscanf 인수에 대해 적절한 레지스터에 각각의 주소를로드 . 그 x86-64에 호출 규칙은 레지스터 rdi, rsi, rcx, rdx, r8r9 상반기 인수 (가정들은 적절한) 및 값 rax에 반환을 사용합니다.

0x400c80을 볼 필요는 없지만 결국 sscanf으로 점프하는 PLT 항목 만 찾습니다. 우리는 이미 심볼 이름에서 sscanf이라는 것을 알고 있습니다.

0

당신이 자신을 알아낼 경우이 더 재미있을 것입니다, 그래서 난 그냥 스택 포인터에서 뺀 힌트

  • 에게 로컬 범위 변수를위한 공간을 할당 상당히 표준 방법에 들어갈 때주지 함수 예 : "lea"는 "load effective address"와 같은 것입니다.데이터를로드하지 않습니다.

  • google sscanf, 스 카 도드 C 라이브러리 함수이며 C99 C 언어 표준이 있습니다. 문자열에서 데이터를 읽고 데이터 문자열, % 이스케이프 변환 지정자가있는 형식 문자열 및 검색 및 변환 된 데이터를 배치 할 변수에 대한 포인터를 사용합니다. sscanf의 내부를 추적 할 필요는 없지만 반환 값을 찾으십시오.

  • C 함수는 % eax에서 가장 자주 결과를 반환합니다. %의 EAX는 호출하기 전에 삭제하고, 호출 후, 테스트, 폭탄 조건부 결과

그리고 그것을 알아 내기 위해 충분히 제공해야한다에 따라 (여부) 피할 수있다. 재미있어!