프로토스타

[프로토스타] stack4

-dP- 2019. 1. 9. 16:18

stack4.c


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