2013-06-21 4 views
0

execve()를 사용하여 부모 프로세스에서 정의한 특정 환경 변수가있는 자식 프로세스를 실행하는 부모 프로세스를 사용하고 있습니다. 부모 프로세스에서 메모리 위치 $ esp + 0x240을 보면 모든 환경 변수를 찾습니다. 그러나 일단 자식 프로세스가 시작되면 미리 정의 된 환경 변수가 저장된 메모리 주소를 찾을 수 없습니다.execve()를 사용하여 자식 프로세스를 실행하는 환경 변수

execve()는 부모 프로세스를 자식 프로세스로 대체하기 때문에 자식 프로세스에 전달 된 환경 변수는 환경 변수 문자열의 길이에서 (Linux의 경우) 빼기 0xbffffffa에 위치 할 것이라고 생각했을 것입니다. 그러나 자식 프로세스가 시작되면 더 이상 해당 위치를 메모리에 액세스 할 수 없습니다. execve()를 호출하기 전에 부모 프로세스의 esp는 0xbffff120이고, 일단 자식 프로세스가 시작되면 esp는 0xbf9835a0으로 점프합니다. (자식 프로세스가 부모 프로세스에 없었던 루트 권한을 가지고 있기 때문입니다.) 이제 스택의 맨 위에서 메모리에 더 이상 액세스 할 수없는 지점까지 메모리를 살펴보면 상위 프로세스에서 전달 된 환경 변수에 서명되지 않았습니다. 그들이 어디에 위치합니까? 또한 좀 더 일반적인 메모에서 프로세스를 실행할 때 스택의 맨 아래에 메모리의 하이 엔드에 복사 된 환경 변수가 모두 있습니까?

#include <stdio.h> 
#include <stdlio.h> 
#include <string.h> 
#include <unistd.h> 

char envvari[]= 
"\x31\xc0\ ...." // Can be any environment variable 

int main(int argc, char *argv[]) { 
    char *env[2] = {envvari, 0}; 
    unsigned int i, ret; 
    char *buffer = (char *) malloc(160); 
    char *args[] = {"notesearch", buffer, 0}; 

    ret = 0xbffffffa - (sizeof(envvari)-1) - strlen("./notesearch"); 
    for(i=0; i < 160; i+=4) 
     *((unsigned int *)(buffer+i)) = ret; 

    execve("./notesearch", args, env); 
    free(buffer); 
} 
+1

* 코드를 설명하는 대신 실제로 코드를 * 표시하는 것이 좋습니다. –

+0

몇 가지 코드없이 도움이되는 대답을 얻지 못할 수도 있습니다. +1 @ Joachim Pileborg –

+0

여러분 중 일부는 Jon Erickson의 '착취 기술'이라는 책에서이 코드의 예를 보았을 것입니다. –

답변

1

execve()는 하위 프로세스를 만들지 않습니다. 기존 프로세스를 대체합니다. 또한 execve()는 결코 반환하지 않습니다. fork()는 하위 프로세스를 만드는 시스템 호출입니다. execve()가 성공적으로 수행되면 execve()가 실행 된 후 free (버퍼) 호출이 실행되지 않습니다.