-
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