stack4.c
void win() { printf("code flow successfully changed\n"); } int main(int argc, char **argv) { char buffer[64]; gets(buffer); }
출처: http://liveoverflow.com/binary_hacking/protostar/stack4.html
1. 해결 및 분석
1-1. stack4.c 저장 및 컴파일
gcc -z execstack -w -no-pie -o stack4 stack4.c
1-2. gdb ./stack4
disas main
retrun으로 갈 때에 win()함수로 가게 값을 변경해 주어야하기 때문에
b *main+38
pattern create 100을 통해 임의 문자 100개 생성
r
생성된 임의 문자 100개
1-3. 주소값
return시 스택 처음 위치에 있는 걸 가져오므로
드래그된 부분을 복사하여
pattern offset (드래그된 부분)
buffer를 72개 채우면 된다.
다음으로 win() 함수로 이동해야하니까 win() 함수의 주솟값을 알아보자.
드래그한 부분이 전달되는 win()함수이다.
이제 코드를 작성해 보자.
1-4. 코드 작성
stack3와 크게 달라진 것은 없다.
p64()를 하지 않으면 \x00\x00\x00 이런식으로 해야하는 번거로움이 있다.
1-5. 해결
따란 성공!
갑자기 생각난 범용레지스터 정보: http://blog.naver.com/PostView.nhn?blogId=67sooon&logNo=10166021894
참고 자료: https://www.inflearn.com/course/%ED%94%84%EB%A1%9C%ED%86%A0%EC%8A%A4%ED%83%80/
피드백 환영입니다!
'프로토스타' 카테고리의 다른 글
[프로토스타] stack5-2 (return to library) (0) | 2019.01.15 |
---|---|
[프로토스타] stack5-1 (스택 접근) (0) | 2019.01.10 |
[프로토스타] stack3 (0) | 2019.01.09 |
[프로토스타] stack2 (0) | 2019.01.09 |
[프로토스타] stack1 (0) | 2019.01.08 |