티스토리 뷰





FTZ level 12

pw : it is like this


레벨 12입니다.


레벨 11에서 한 bof와 공격방법은 비슷합니다.


먼저 힌트를 보겠습니다.


아까와 달라진 점이 보이시나요?

argv로 입력을 받지 않고 gets함수로 입력을 받습니다.


당연히 버퍼오버플로우 취약점은 존재합니다.


str의 크기도 똑같군요.


디버깅을 하기위해 tmp폴더로 옮겨주도록 하겠습니다.



어셈블리 코드를 보겠습니다.



아까와 같이 0x108(264)만큼의 스택 프레임이 형성되어 있습니다.


gets 함수로 바뀌면서 아까와는 다른 방식으로 공격을 해야하는데요.


이번에도 NOP sled 로 풀어보겠습니다.



공격 시나리오를 생각해보겠습니다.


먼저 level11과 같은 스택 구조이기 때문에 227개의 nop과 25바이트의 shellcode 16바이트의 여유 NOP + [ret]을 하면 될 것 같습니다. NOP의 주소를 리턴어드레스로 지정하여 NOP의 흐름따라 shellcode를 실행시켜보겠습니다.


먼저 NOP의 주소를 알기위해 디버깅해보겠습니다.

입력을 받고  esp 상태를 보기위해서 브레이크포인트를 gets함수 이후이자 프로그램이 종료 전인 main+87 leave에 걸어주겠습니다.


프로그램을 실행시키고 긴 문자열을 적었습니다.



x/100x $esp로 확인 합니다. NOP의 주소를 알 수 있군요.

NOP의 주소는 0xbfffe85c로 하겠습니다.

payload 입니다.


(python -c 'print "\x90"*227+"\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"+"\x90"*16+"\x5c\xe8\xff\xbf"';cat) | ./attackme


아까와 조금 다릅니다.

그 이유는 gets함수는 | 파이프 명령을 통해 값을 넘겨줘야 하기 때문이죠.


NOP의 주소가 일정하지 않아 몇 번 브루트 포싱을 해줘야 합니다.



계속 세그멘테이션 오류가 뜨다가 shell이 실행되어 명령어로 인식을 합니다.


이제 쉘을 얻었으니 tmp파일이 아닌 실제공격을 해보겠습니다.



권한을 획득했습니다.





Level13 Password is "have no clue".

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

[Hackerschool FTZ] Level14 write-up  (0) 2018.01.15
[Hackerschool FTZ] Level13 write-up  (0) 2018.01.15
[Hackerschool FTZ] Level11 write-up  (0) 2018.01.15
[Hackerschool FTZ] Level10 write-up  (0) 2018.01.14
[Hackerschool FTZ] Level9 write-up  (0) 2018.01.14
Comments