티스토리 뷰




FTZ level18

pw : why did you do it


레벨 18입니다.


hint를 보겠습니다.


코드가 꽤 깁니다.


코드를 보겠습니다.


이 문제에서 FD 파일디스크립터에 대해서 좀 나오는데 굳이 안 필요한 내용이니 구글링을 부탁드립니다.


먼저 이렇게 지역변수들이 선언되어있습니다.



count가 아직 뭔지 모르고 별로 안중요한 if문인 것 같습니다.


그 다음 if문이 중요해 보이는데요 check 변수의 값이 0xdeadbeef이면 shellout이라는 함수를 실행합니다.



shellout함수는 sh을 실행시켜주는 함수입니다.


그리고



중요한 부분인데요.

read함수로 입력을 받고 \r, \n, 0x08 이라는 케이스가 있네요.


0x08에서 count를 줄여줍니다.


참고로 count의 초기값은 0입니다.


그리고 default에서 string[count] = x;

로 값을 넣어주는군요.


음 아직 잘 모르겠습니다.


다시 변수 선언 부분을 보겠습니다.



‘먼저 선언 된 변수가 높은 메모리 주소를 가진다’


해커스쿨 대학교에 있던 문서에 있는 내용이였습니다.


string이 먼저 선언되어있으니 string이 check보다 높은 주소를 가지겠군요.


어라? 그러면 그동안 해오던 bof로 check값을 수정을 못할 것 같습니다.ㅠㅠ


하지만 string[-1], [-2], [-3] 을 이용해서 더 낮은 메모리 값을 수정 할 수 있습니다.


string[count] = x 로 값을 변경해주니 count값이 음수여야 더 낮은 주소의 값을 수정할 수 있는데요!



count--?


감이 오는군요.

0x08로 count의 값을 0에서 몇번 --해준다음 check부분에 0xdeadbeef를 값으로 적어주면 될 것 같습니다.


이제 분석을 해보겠습니다.


분석을 위해 원본파일을 tmp폴더 안으로 옮기고 gdb로 분석해보겠습니다.

보기 편한 intel형식으로 set했습니다.


디스어셈블 된 main입니다.

중요한 부분만 짚어보겠습니다.


스택프레임이 0x100만큼 구성되어있습니다.


0x100은



256입니다.



ebp-104가 check임을 알 수 있네요.


따라서 esp+152가 check입니다!


이부분이 swutch case문인 것을 알 수 있는데요.

여기가 default임을 알 수 있습니다.

jmp를 해보면



eax에 ebp-100을 넣네요


여기서 ebp-100이 string 배열의 시작을 알 수 있습니다.



따라서

esp+156이 string의 시작 이네요.


저희는 check 값을 변경해야하니


count -4만큼 한 뒤 값을 변경해주면 될 것 같습니다.


--를 하는 값은 0x08입니다.


바로 페이로드를 짜보겠습니다.

(python -c 'print "\x08"*4+"\xef\xbe\xad\xde"';cat)|./attackme


0xdeadbeef는 리틀엔디언으로 넣어줍니다.

권한을 얻었습니다.


이제 실제 파일에 공격을 해보겠습니다.



권한이 상승되었습니다.



Level19 Password is "swimming in pink".




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

[Hackerschool FTZ] Level19 write-up  (0) 2018.01.18
[Hackerschool FTZ] Level17 write-up  (0) 2018.01.17
[Hackerschool FTZ] Level16 write-up  (0) 2018.01.15
[Hackerschool FTZ] Level15 write-up  (0) 2018.01.15
[Hackerschool FTZ] Level14 write-up  (0) 2018.01.15
Comments