티스토리 뷰

LEVEL11의 힌트를 보겠습니다. strcpy만 봐도 이제 BOF 취약점을 이용해야 겠다는 것을 알겠죠? 일단, BOF 취약점을 생각하고 GDB를 통해 리버싱 해보겠습니다.


dir을 보면 attackme라고 실행파일이 하나 있습니다. 소스파일은 없고, 덩그러니 있는 것을 보니 위에서 hint를 줬던 소스인가? 하다가 읽기 권한이 있고, setuid 권한이 있습니다.


gdb로 소스를 보면 hint에서 나온 소스와 동일한 것을 알 수가 있습니다. 256바이트의 배열을 할당하고 setreuid를 이용해 level12의 권한(3092)를 획득하고 인자값을 할당한 배열에 복사한 후에 출력해 주는 동작을 하고 있습니다.



아래와 같이 프로시저 부분에서 0x108(264)과 0x8(8)을 빼줍니다. 힌트에서 보면 str[256]을 선언을 했으니, 생각을 해보면 뺴준 값은 264 + 8 = 272입니다. 


[Buffer 256 byte, dummy 8 byte, SFP 4 byte, RET 4 byte] 라고 짐작이 가능합니다.



gdb로 들어와서 메인에 BP를 겁니다.



실행을 해보겠습니다. python으로 A의 243byte를 넣어주고, B의 25byte[셸 코드]를 넣어주고 남은 4byte에는 리턴 값을 넣어주겠습니다.



실행을 하고 esp 스택을 한번 보겠습니다.



0xbffffb1d 부터 0xbffffc2c 까지 python으로 입력한 272 바이트를 채워준 주소값을 알아낼 수가 있습니다. 왜 272바이트인지는 위에서 확인 바랍니다.



위에서 A, B, C에 적어준 값들에 실제 코드를 넣어서 공격을 해보겠습니다. 아래의 메모장에 따로 정리를 했는데, RET 주소는 임의로 0xbffffb7c (NOP(0x90)이 포함되는 주소) 를 정했고, 이 주소는 RET(리턴 값)이 됩니다. 


아래의 쉘 코드는 25바이트이고, 구글을 통해 가져온 코드입니다. 왜 NOP가 243바이트인가 하면 리턴 값과 쉘 코드를 합하면 29바이트이기에 272 - 29 = 243 byte를 채워주기 위해서 NOP를 넣습니다. 




아래는 attackme를 실행하면서 인자로 python -c를 이용해서 위에서 입력한 코드대로 변환해서 272바이트를 적어 넣었습니다.



sh 모드로 변경이 되었고, id를 확인하면 level12 권한으로 들어온 것을 확인 가능합니다.


 

이 기법은 NOP 슬라이드 기법으로 RET 주소를 NOP로 리턴하게 하고, 내려오면서 Shellcode(25byte)를 실행하는 구조입니다.


'시스템해킹 > FTZ' 카테고리의 다른 글

FTZ LEVEL10 문제풀이[공유메모리]  (0) 2015.07.25
FTZ LEVEL9 문제풀이[BOF]  (0) 2015.07.23
FTZ LEVEL8 문제풀이  (0) 2015.07.22
FTZ LEVEL7 문제풀이  (0) 2015.07.22
FTZ LEVEL6 문제풀이(시스템 인터럽트)  (0) 2015.07.21
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함