2013-03-24 1 views
0

buflab of CSAPP의 문제입니다. 스택을 손상시킬만큼 충분히 오랫동안 일부 익스플로잇 코드를 입력하라는 메시지가 표시됩니다. 2 단계에서 먼저 global_value이라는 전역 변수의 값을 변경 한 다음 bang이라는 함수를 호출해야합니다. 그러나, 나는 강타의 주소를 스택에 넣고 돌아 오는 경우에만 작동합니다.현재 실행중인 함수에서 빠져 나올 수 있습니까?

#codes before set the value of global_value 
movl $0x12345678,%eax   /* 0x12345678 is the address of bang */ 
push %eax 
ret 

나는 그 때 나는 완전히 GDB와 0x5abcdefg 같은 곳에서 길을 잃었다

#codes before set the value of global_value 
jmp 0x12345678 

같은 직접 점프를 사용하는 경우. 누구든지 도울 수 있니? 이것은 모드의 주소 지정과 관련이 있습니까?

+0

' longjmp()' –

답변

0

jmp 0x12345678은 (는) 실제로 jmp 0x12345678입니다.

직접 피연산자로부터 점프 주소를 취하는 모든 비 - 원 점프는 jmp 명령어 바로 다음 위치의 명령어와 관련이 있습니다. 메모리에있는 경우

그래서, 다음

Address Contents 
0x55555555 E9 78 56 34 12 

그런 다음이 0x55555555 + 5 (JMP 명령 길이)로 점프 + 0x12345678 = 0x6789ABD2입니다. 이 경우

는 OTOH는 :

Address Contents 
0x55555555 E9 1E 01 DF BC 

을 다음이 0x55555555 + 5 (JMP 명령 길이)로 점프 + 0xBCDF011E = 0x12345678입니다.

+0

을 사용합니다. 늦은 답변 죄송합니다. 정말 고마워. – wlnirvana

+0

또 하나의 질문 .... 어셈블러는 내 수익이 가까운 것이거나 먼 하나라는 것을 어떻게 알 수 있습니까? 0x55555555에 대한 진정한 복귀는'ret 0x5555555'에 의해 끝날 것입니까? – wlnirvana

관련 문제