ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • const overwrite, 버그헌팅하면서 배운점
    Hack/Pwnable 2016. 7. 19. 00:07

    const 는 C언어를 하면 누구나 알고있듯이 상수로, 변수와달리 한번지정한후로 절대 바꿀수없는 값이다.


    취약점을 찾았는데 오버플로우를통해 그 다음에 있는 주소가 const로 선언된 변수였다.


    strcpy, sprintf같은 함수로 터졌었는데, 멍청하게 좀 오래 생각했었다..


    #include <stdio.h> int main(int argc,char *argv[]) { const char v25[4] = "CCCC"; char buf[20]; strcpy(buf,argv[1]); if(v25 == "AAAA") { printf("good!\n"); } else { printf("no\n"); } printf("%s",v25); return 0; }


    코드는 이렇게 작성했다. 일단 내가 생각한 바로는 이랬다


    const는 C 코드를 작성할때 값을 바꿀수없으니까 아마 w 권한을 안줘서 그런거아닐까(직접분석해본적이없음 사실상 그럴리가..)


    그래서 직접 테스트해보았다.


    0xffffdca0: 0x00000002 0xffffdd64 0x41414141 0xf7e4b100

    0xffffdcb0: 0xf7fbf3c4 0xf7ffd000 0x080484fb 0x43434343



    아주 평온하다 스택에 내가 넣어준 인자값인 AAAA와, 16바이트 이후에 v25 변수가 CCCC로 초기화되어있는것을 볼수있다.


    그럼 저게 덮히는지 확인해보면되는데, 짧게 짧게 가자


    Starting program: /home/s0ngsari/bug $(python -c 'print "B"*24')


    Breakpoint 1, 0x080484a6 in main ()

    (gdb) x/100x $esp

    0xffffdc70: 0xffffdc88 0xffffde7f 0x0804a000 0x08048542

    0xffffdc80: 0x00000002 0xffffdd44 0x42424242 0x42424242

    0xffffdc90: 0x42424242 0x42424242 0x42424242 0x42424242



    = 덮히는걸 확인할수있다.




    #include <stdio.h> int main(int argc,char *argv[]) { const char v25[4] = "CCCC"; char buf[20]; strcpy(v25,"AAAA"); printf("%s\n",v25); strcpy(v25,"FFFF"); printf("%s",v25); return 0; }



    이 코드도 문제없이 실행될거다, 위에 값을 덮어줬으니, 돌려보면 성공적으로 덮어씌워진다.


    간단한거였지만 갑자기 생각해보니까 헷갈려서 직접 해보았다.


    궁금증해결완료!

    'Hack > Pwnable' 카테고리의 다른 글

    포맷스트링(Format String Bug) GOT Overwrite  (0) 2016.08.17
    Off-by-one  (0) 2016.08.11
    ARM Shellcode 간단한거..  (0) 2016.06.29
    Pwnable.kr dos4fun  (0) 2016.05.09
    16bit Debugging/ 16bit Dynamic Debugging  (0) 2016.05.09

    댓글

Designed by Tistory.