ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • level 16
    war game Write up/ FTZ 2018. 11. 14. 17:37



    이 문제는 이전 문제들과 다르게 함수를 사용해서 코딩을 해놓았다.. 덕분에 황당함을 감추지 못했다고,,

    간단하게 코드분석부터 해보면 main() 함수부터 crap 변수를 int형(4) 로 선언해주고 printit()함수의 호출 주소를 call에 저장하고 buf 변수를 char형(20)으로 선언했다. 그리고 fgets 함수를 이용해 표준입력을 받는다. 그 후에는 call 을 불러와 printit()함수를 호출한 후 프로그램이 종료된다.


    여기서 생각해볼 수 있는것이 printit함수의 호출 주소를 저장하는 변수가 있는데 이곳을 shell() 함수를 호출하는 주소로 오염시켜버리면? 쉘을 얻을 수 있을것이다.

    근데 지금 손목이 너무나도 아프다, 그렇다 이건 의식의 흐름이니 무시하고


    gdb로 분석을 해보자.




    함수가 3개이니 차례로 main()

    shell()

    printit()함수이다.


    여기서 각 함수의 시작 주소는 

    main() -> 0x08048518

    shell() -> 0x080484d0

    printit() -> 0x08048500


    어? 그럼 여기서 그냥 0x080484d0을 집어넣어주면 되는게 아닌가? 스택구조를 살펴보자!!!!!

    (너무 귀찮다..)


    다음과 같이 스택구조가 나왔다,

    그럼 buf에서 void (*call)() 까지의 거리는 ?

    main+6의 ebp-16에서 0x8048500을 불러오는것을 알 수 있다. 그럼 ebp-16에 0x080484d0을 넣어주면 되는데

    ebp-56에서 fgets 함수가 시작되므로 그 사이의 값은 40byte라는 것을 알 수 있게된다.

    buf 의 값이 20이니 더미는 20?이 될것이다.


    그럼 아래와 같이 스크립트를 자면 되겠다.



    'war game Write up > FTZ' 카테고리의 다른 글

    level18  (0) 2018.11.16
    level17  (0) 2018.11.14
    level15  (0) 2018.11.14
    level 14  (0) 2018.11.14
    level13  (0) 2018.11.01
Designed by Tistory.