ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • pwnable.kr passcode
    Pwnable/Pwnable.kr 2017. 1. 23. 02:42



    passcode의 소스코드이다. 이 소스코드에서 가장 문제점이 될곳은 바로 scanf("%d", passcode1), scanf("%d", passcode2) 이 부분이다. C언어에서 입력받을 떄 %s 뺴고는 scanf("%d",&변수이름) 이런식으로 변수에 해당되는 주소에다가 값을 넣는다. 하지만 &를 쓰지않는다면 ? 변수에 해당되는 주소에 값을넣는게 아니라 변수가 가르키고있는 주소의 값에 입력을 한다는 뜻이다. 여기 사진에서는 짤렷지만 passcode1,2 를 선언만하고 초기화를 하지않았기 때문에 이상한 쓰레기 주소에 입력을 받게된다. 우리는 이것을 이용해 flag를 얻어낼것이다. 


    passcode가 가르키고있는 주소값을 어떻게 바꿀 수 있냐하면 welcome에서 이름을 입력하는부분이 ebp-0x70, passcode 부분이 ebp-0x10 부분이다. 이 둘의 거리는 96(70-10 10진수로) 이 될것이다. 그 다음에는 


    plt,got를 공부해야한다. 이 plt, got는 포너블에서 엄청 중요하기 때문에 이 문제를 푼 후에도 공부하길 바란다. 


    예시로 printf 함수를 실행할떄에도 call printf 를한 후 그 call한 printf 함수 안에서도 jmp를 한 후 많은 코드를 실행한 후 출력을 시킨다. 이 떄 맨 처음 call을 할떄 printf의 주소를 call했을텐데 이 떄 printf 주소가 plt 주소다. 그리고 jmp를 하는 주소가 got이다.(자세한 설명은 구글링을 하길 바란다.) 위에서 passcode가 가르키고있는 주소값에 입력을 받는다했다. 이 가르키고있는 주소를 fflush got주소로 할것이다. 왜 fflush를 하느냐 우리는 일단 passcode1를 변조할수있다. 그럼 그 변조한후 call하는 함수로는 무엇이있나? 바로 fflush이다. 그리고 우리는 세그먼트 오류로 인해 if문을 실행시키지 못한다. 그떄문에 if문 전에 plt, got를 이용할수있고, passcode1 입력후 호출하는 함수를 사용해야한다. 이 조건에 충족되는 함수는 바로 fflush 이다.


    gdb를 보면 알겠지만 call 0x8048430 을 한다. 이것이 plt , jmp 0x804a004이 부분이 got부분이다. 

    그리고 우리는 got에 값을 넣어서 flag를 얻을 수 있는 부분은 어느 부분일까? 바로 if문을 참이 됫을떄 실행system("/bin/cat flag"); 부분이다                


     


    우리가 써야될 system("/bin/cat flag")의 시작부분인 0x80485e3, 저기서 movl 0x80487af가 위 사진처럼 "/bin/cat flag" 부분이다. 


    더미값을 채운 후 passcode 를 got주소를 가르키게한 후 가르키는 주소값에 system("/bin/cat flag")를 실행 시키게 하면될것이다. 그리고 우리는 passcode를 입력할떄 %d인 정수를 입력하기때문에 리틀엔디비안으로 주소를 입력하는게아닌 주소값을 정수로 바꿔야한다.


    이 풀이를 참고하면서 풀면될것이다.

    'Pwnable > Pwnable.kr' 카테고리의 다른 글

    pwnable.kr shellshock  (0) 2017.01.23
    pwnable.kr random  (0) 2017.01.23
    pwnable.kr flag  (0) 2017.01.23
    pwnable.kr bof  (0) 2017.01.23
    pwnable.kr fd  (0) 2017.01.22
Designed by Tistory.