코드분석을 해보자.
argc 는 2개 (인자 하나) 그리고 인자값은 5개 이상이어야 한다.
버퍼에 argv[1]의 입력을 memcpy 해주고, memset으로 끝 4자리 빼고 다 0으로 초기화 해버린다.
functionpointer의 주소를 bad함수로 초기화해주는데
good 주소로 가면 쉘을 딸 수 있다.
기본적인 버퍼오버플로우로 functionpointer가 저장되어있는 메모리에 가서 good의 주소를 덮어써주면 된다.
bad와 good주소는 친절하게도 실행 시켜보면 안다. 인자 대충 5개이상 때려보자
memcpy 이후에 브레이크 포인트를 걸고 버퍼 크기만큼 50개를 덮어준다.
우리의 bad함수의 주소는 0x080484a4이였다.
A가 50개 덮어지고 저기 밑에 보면 빨간색으로 bad함수의 주소가 보인다.
이 부분을 good 주소로 바꿔주면 문제가 풀릴 것이다.
주소는 0xbffffc8c(0x080484a4인 bad함수가 초기화되었을때, 즉 functionpointer의 주소가 담겨있는 주소) - 0xbffffc40(버퍼시작주소) = 76
버퍼에 76개를 덮고 good주소를 덮어주자.
페이로드: ./level03 `python -c 'print "A"*76 + "\x74\x84\x04\x08"'`
'pwnable > SmashTheStack' 카테고리의 다른 글
SmashTheStack ㅅㅁㅅㄷㅅㅌ level6 (0) | 2016.11.03 |
---|---|
SmashTheStack ㅅㅁㅅㄷㅅㅌ level5 (0) | 2016.11.02 |
SmashTheStack ㅅㅁㅅㄷㅅㅌ level4 (0) | 2016.11.02 |
SmashTheStack ㅅㅁㅅㄷㅅㅌ level2 (0) | 2016.10.14 |
SmashTheStack ㅅㅁㅅㄷㅅㅌ level1 (0) | 2016.10.13 |