선언된 2가지 변수
buffer 64개의 배열선언
modified에는 0을 채워넣고
gets(buffer) 객체 - scanf 사용자 입력을 받는 것
버퍼에다가 사용자 입력을 받아서 전달을 해주는 것
modified가 0인지 확인
결국에는 modified가 0이 아니게 만들어서 출력해야 함
문제는 modified가 항상 0으로 선언되어있다는 것
스택은 거꾸로 올라가니까 modified를 먼저 선언한다.
버퍼가 가득차면 밑에 있는 것들이 변조가 될 수 있다.
버퍼는 손을 댈 수 있다. 그럼 0이 아닌 숫자로 변조 가능하다.
버퍼를 가들 매워서 modified를 바꾼다.
스택 공격에 취약한 컴파일 명령어
gcc -o stack0 stack0.c : stack0.c에서 stakc0이라는 것을 컴파일해서 만들어줌
아무런 옵션이 없어서 스택 공격에 취약하지 않다.
gcc -z exestack -no-pie -w -o stack0 stack0.c
exestack : 스택을 실행할 수 있는 권한 주기. 일반적으로 스택 실행할 수 있는 권한 없음
-no-pie : 랜덤하게 메모리에 올라가는 것을 없애기
-w : warning 없애기
-
Try again이 나오는 것은 stack0을 더 많이 채워서 버퍼가 넘치도록 해야 한다.
gdb 확인
test랑 je = 점프가 보인다.
여기서넌 eax가 modified 인 것을 확인하고 있다.
변수 확인할 부분이 if문 밖에 없다.
이렇게 A를 넣어본다.
그 후 disas main으로 확인후 info reg $eax를 해본다.
그러면 41이 나오는 것을 확인할 수 있다.
41로 되어있는 것이 데이터 스택 모양 보기
q는 quit을 의미하므로 빠져나온다.
즉, 해당 버퍼를 넘치게 만들어서 원하는 문자를 출력할 수 있다.
'security > 시스템' 카테고리의 다른 글
Protostar - Format 3 (0) | 2020.11.05 |
---|---|
Protostar - Format 2 (0) | 2020.11.05 |
Protostar - Format 0 (0) | 2020.11.03 |
Protostar - Stack2 (0) | 2020.09.22 |
Protostar - Stack1 (0) | 2020.09.22 |
댓글