#About


[그림 1] - vampire.c 소스 코드 확인




#Solution


[ + ] 소스 코드 해석


1. buffer라는 배열에 40바이트 할당


2. 조건문을 통해 인자 값을 검사하며 2개 미만일 경우 argv error!를 출력 후 종료


3. 조건문을 통해 사용자 입력 값 중 48번째 바이트가 \xbf가 아니면 stack is still your friend.를 출력 후 종료


4. 조건문을 통해 사용자 입력 값 중 47번째 바이트가 \xff라면 but it's not forever를 출력 후 종료


5. 사용자 입력 값을 buffer에 복사 후 출력


이전 문제와 다른점은 47번째 바이트가 \xff여선 문제를 해결할 수 없다는 점이다 이는 스택의 특성을 생각하면 해결할 수 있다. 


스택은 여러 환경에 의해 크기가 결정되며, 또한 스택 프레임의 크기가 변하면 주소도 조금씩 변한다. 


스택은 메모리의 높은 주소에서 낮은 주소로 자라는 특성 때문에 스택 프레임을 크게 만들어주면 0xbfff....를 지나 0xbffe.... 영역을 사용할 수 있다


임의의 페이로드를 작성하기 위해 스택구조를 떠올렸고 스택의 구조는 | buffer (40) | EBP (4) | RET (4) | 이다


[그림 2] - BreakPoint 설정


위 그림은 strcpy 함수까지 실행시키기 위해 0x80484b9에 중단점을 걸어주었으며 아래와 같이 임의의 페이로드를 작성했다


[그림 3] - 임의의 페이로드 작성


NOP를 65536개를 입력한 것은 스택 프레임을 크게 만들어주기 위함이며 0xbffe....의 시작은 끝에서 5번째 자리 부터 시작하므로 16^4개 만큼 채워주었다


또한 NOP과 셸 코드를 채워주었던 세 번째 인자인 argv[2]의 시작 주소는 0xbffefc5c임을 확인했으므로 아래와 같이 페이로드를 작성할 수 있다


| 임의의 값 (44byte) | argv[2] 시작 주소 (4byte) | NOP (65536byte) | 셸 코드 (48byte) |


[그림 4] - 셸 획득


+ 이상하게도 기존에 사용하던 24byte 셸 코드는 먹히지 않았으며 위 문제 해결에 사용한 48byte 셸 코드는 아래와 같다


\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff

\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81



+ Recent posts