확실히 LOS보다 LOB가 재밌는듯
/*
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);
}
보아하니, egghunter(이거 계속 막혀서 까먹을듯...egg export=`python~~), bufferhunter, \xbf, argv[1]길이 제한, argv[0] should 77 등이 있다.
argv[1]의 길이의 제한이 중요한게 아니라 argv[0]의 길이의 제한이 중요한데, 우리가 페이로드를 작성할때 쓰는 [./gremlin] 이 명령어의 길이를 무슨 수로 77자를 맞출까?
첫번째 방법은 심볼릭 링크를 만드는 것이고,
그 명령어는 ln -s [링크를 지정할 파일] [링크이름] 이다.
나도 처음엔 이 방법으로 풀었고, 같은 방법으로 풀면 재미없으니깐 다른 방법을 사용하겠다.
우리가 파일을 실행할때 쓰는 명령어는 [./]요건데 [/]이 기호는 디렉토리를 분리해주는 기호고, 안에 값이 없으면
아무리 적어도 의미없는 기호다. 지금 상황에 딱 필요한 기호지.
혹시나 blank, 즉 스페이스바를 기호로 인식한다고 가정하고 시도해봤는데 실패했다 ㅋㅋㅋ
이제 주소가 나왔으니깐 페이로드를 작성하면, (주소가 나온 이유는 LOB 6번 문제처럼 코드를 수정했다)
이게 이상한게 봐바
내가 분명히 풀이쓰려고 전에 풀때 쓴 파일 지우기 전에 bash2 해줬는데 에러가 뜨는데
다시 bash2해주니깐 풀리네 ㅋㅋㅋㅋㅋㅋㅋㅋ
뭐 bash2도 유통기한이 있나?