2012-08-07 1 views
1

: http://www1.telhai.ac.il/sources/private/academic/cs/557/2659/Materials/Smashing.pdf버퍼에 악성 코드가 삽입 된 후 런타임 스택이 어떻게 유지됩니까? I는 버퍼 오버 플로우에 다음 용지를 판독 하였다

용지의 예에 따르면, 공격자는 오버 플로우 버퍼의 주소를 가리 키도록 리턴 어드레스를 수정 된 버퍼에 코드를 삽입. 삽입 된 코드와 로컬 변수가 모두 스택에 있기 때문에 공격자가 버퍼로 코드를 오버플로하기 전에 로컬 변수에 충분한 공간을 남겨 두지 않았습니까? 넓은 의미에서, 나는 스택에 코드와 로컬 변수가 모두있을 때 스택이 유지되는 방법을 혼란스러워했다 .... 거기에 주입 된 코드를 덮어 쓰는 로컬 변수의 가능성이 있는가 ???

답변

0

하나의 해결 방법은 로컬 변수를 사용하지 않는 것입니다. 이것은 작을 것이고 어쨌든 다른 것을 호출하여 작업을 수행하는 코드에 반드시 큰 제약이되는 것은 아닙니다. (아주 큰 제약이 아니라는 점에서 매우 친척이다. 필자는 나를 넘어선 다. 그러나 이것은 쓰기 쉬운 코드가 아니기 때문에 그 맥락에서 큰 제약이 아니다.)

그래도 필요한 것은 아닙니다. 그래서 스택에 기록 실행 코드가 떨어져 그 코드의 로컬 한다거나 할에서 할 수 있습니다

Function A Arg 2 
Function A Arg 1 
Function A Arg 0 
Return Address into caller 
Function A Local 1 
NastyCode bytes 0-3 
NastyCode bytes 4-7 
NastyCode bytes 8-B 
NastyCode bytes C-E 
NastyCode bytes F-10 
NastyCode bytes 10-13 
NastyCode bytes 14-17 
NastyCode bytes 18-1B 
NastyCode bytes 1F-20 
... 
NastyCode arg 0 (etc.) 
Return Address (of NastyCode [may not even be valid, may return to original caller, or may jump into something it'll set up]). 
NastyCode Local 2 
NastyCode Local 1 
NastyCode Local 0 
Return Address (should be of Function F, into a point in Function E but it's changed to point to byte 0 of NastyCode) 
Function F Local 2 
Function F Local 1 
Function F Local 0 

:처럼 보이는으로

Function A Arg 2 
Function A Arg 1 
Function A Arg 0 
Return Address into caller 
Function A Local 1 
Function A Local 0 
Function B Arg 1 
Function B Arg 0 
Return Address into place in Function A's executable code. 
Function B Local 2 
Function B Local 1 
Function B Local 0 
Function C Arg 0 
Return Address into place in Function B's executable code. 
Function C Local 3 
Function C Local 2 
Function C Local 1 
Function C Local 0 
... 

버퍼 오버 플로우 트릭이 : 스택과 같이 보일 것입니다.

+0

아직도 주입 된 코드가 지역 변수를 사용하는 경우 어떻게 작동하는지 명확하지 않습니다. Intelx86에 따르면 스택의 프레임 포인터/기본 포인터는 반환 주소 아래에 저장되므로 반환 주소를 수정할 때 프레임 포인터 (fp)도 수정됩니다. 이제 내 주입 된 코드가 로컬 변수를 사용하고 수정 된 fp가 액세스 할 수없는 임의의 위치를 ​​가리키면 코드가 실패 할 수 있습니다 ..... – user1484793

+0

위의 경우 프레임 포인터는 "Function F 로컬 2 ". 그 위에는 "Function F Arg 0"(또는 함수 E의 현지인이거나 F가 args가없는 경우 반환 주소, E locals가없는 등)가 있습니다. 우리는 FP 위의 스택 영역을 채우거나 그 밑의 영역을 채우거나 (더 현실적이되어야합니다), 우리는 FP가이 코드로 가리키는 주소를 변경합니다 (변경하지 마십시오). FP 자체). 그런 다음 코드로 돌아갑니다. 다시 한번 말하지만, 우리는 현지인이 실제로 필요하지 않습니다. 작은 일회용 함수는 하드 코딩 된 값만 사용할 수 있습니다. –

+0

내가 언급 한 논문을 따르면 다음과 같은 함수 f (이 예제에서)의 반환 주소와 지역 주민들간에 컴퓨터는 코드를 작성할 때 수정되는 기본 포인터 (인텔 아키텍처의 ebp)를 저장합니다. – user1484793

관련 문제