프로토스타

[프로토스타] stack7-2 (ROP)

-dP- 2019. 1. 18. 14:37

stack7.c



#include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <string.h> char *getpath() { char buffer[64]; unsigned int ret; printf("input path please: "); fflush(stdout); gets(buffer); ret = __builtin_return_address(0); if((ret & 0xb0000000) == 0xb0000000) { printf("bzzzt (%p) ", ret); _exit(1); } printf("got path %s ", buffer); return strdup(buffer); } int main(int argc, char **argv) { getpath(); }



출처: http://liveoverflow.com/binary_hacking/protostar/stack7.html



1. 문제 해결 및 분석


1-1. gdb ./stack7




gdb ./stack7




disas main



b *main




r



1-2. system, /bin/sh 주소




print system 혹 disas system





find /bin/sh





offset을 알기 위해 pattern create 100



disas main




b *main + 14



r




1-3. offset






처음에 b *main을 했기 때문에


r 이후에




conti 해서



(임의 문자)







where을 통해 스택 맨 위에 있는 값을 복사



pattern offset (복사한 값)



offset = 80임을 알 수 있다.




1-4. 코드 작성 및 실행




ret -----------> system




하는 것이 아니라




ret -----------> ret -----------> system






하게 되면 return을 함과 동시에 ebp가 한 칸 내려가면서 system에 접근할 수 있다.





따라서 ret의 주소를 추가하면 된다.



참고 자료: https://www.inflearn.com/course/%ED%94%84%EB%A1%9C%ED%86%A0%EC%8A%A4%ED%83%80/


피드백 환영입니다!