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