11탄은 golem이다. 코드를 살펴보자. golem 프로그램의 특징은 다음과 같다. 1. 인자값이 2개 이상일 것2. 2번째 인자값은 48번째 값이 \xbf이어야 함3. 2번째 인자값을 buffer 변수로 strcpy로 복사4. buffer 변수에 저장된 값들을 전부 0으로 초기화.5. buffer+48부터 0xbfffffff 까지 0으로 초기화. 즉 RET 값을 제외한 buffer 이후의 값들은 전부 0으로 초기화 하는 것이다. 여기서 LD_PRELOAD 를 사용하라는 조언을 받아 해당 용어를 찾아보았다. LD_PRELOAD는 공유 라이브러리의 위치를 저장하는 환경변수 이름이다. 그렇다면 공유 라이브러리를 활용해서 이 문제를 공격해야 한다는 것을 알 수 있다. 공유 라이브러리는 스택 영역이 아닌 공유..
우선 코드를 살펴보도록 하자. 우선 코드를 분석하면서 지켜야할 규칙에 대해 분석해보도록 하자. 1. 인자값이 2개 이상인가 (argc < 2) 2. 환경변수 사용 X (egghunter) 3. argv[1]의 길이가 48보다 클 경우 프로그램 종료 (check the length of argument) 4. buffer[40] 변수를 이용한 공격 무효 (buffer hunter) 5. 모든 argv의 값들 초기화 (ultra argv hunter) 인자값들과 변수를 이용한 공격을 무효화 시키게 되었다. 그렇다면 메모리에 쉘코드를 저장할 수 있는 공간이 어디 있는지 생각을 해보았다. 모든 프로그램은 메모리의 맨 마지막 부분에 여러 환경변수들과 해당 프로그램에 대한 정보를 저장하고 있다는 점을 착안하여 es..
우선 코드를 살펴보도록 하자. 여러 검사 기능들이 사라지고 1가지가 추가 되었다. 바로 argv[1]에서 [46]번 인덱스에 \xff가 들어가면 printf를 수행하지 않고 종료가 되도록 설정 되었다. 이러한 점을 피하여 strcpy 까지 접근 하여야 버퍼 오버플로우를 일으킬 수 있는 상황이 된다. 평소에 접근하는 메모리 주소값들이 전부 0xbfff~~~~이런 식으로 접근하였는데 스택에 메모리가 구성되는 점을 이용하여 문제를 해결해야 한다. 스택에는 사전에 선언된 변수에 대하여 저장이 되는데 그 위에는 argv에 대한 공간이 구성되어 있다. 따라서 argv의 값을 매우 긴 값을 넣게 된다면 쉘코드를 넣게 될 argv나 buffer에 대하여 메모리 주소가 0xbfff~~~~를 벗어날 수 있게 된다. 문제를..