일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 리눅스
- 커널
- Bandit
- radare2
- 리눅스 커널
- 리버싱
- 취약점
- 시그널
- wargame
- 시스템해킹
- Pwnable.kr
- 어셈블리어
- 워게임
- 시스템
- 프로그래밍
- 드론
- 리눅스커널
- pwn.college
- 알고리즘
- 시스템프로그래밍
- Leviathan
- kernel
- pwncollege
- C언어
- px4
- C++
- write up
- 컴퓨터구조
- css
- 시스템 프로그래밍
Archives
- Today
- Total
Computer Security
#17 Memory map (실습) 본문
반응형
mmap API를 이용해서 파일의 내용을 메모리에 매핑 해보자.
시작 하기 앞서, 이전에 read API 를 하면서 작성했던 예제를 먼저 다시 살펴보자.
dump_info 부분을 보면 모든 내용을 출력하는 코드가 있는데, 이 부분을 mmap API를 이용해서 내용을 읽어서 처리할 수 있도록 해보자.
1. read.c 부분을 우리가 실습할 mmap 디렉토리 안에 read_mmap.c 이름으로 카피해서 넣어준다.
2. dump_info 부분을 mmap 을 이용할 것이기 때문에, dump_info 부분을 지워준다.
3. open 명령어를 이용해서 person_info 파일을 열어주고, 예외처리 해준다.
4. mmap API를 이용해서 매핑 해준다.
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
1. addr : NULL (커널이 알아서 주소 설정하게끔해준다.)
2. length : sb.st_size (파일의 사이즈를 모르니 stat API 를 이용해서 확인한 뒤, st_size 명령어를 통해 파일의 사이즈를 넣어주자.)
#incldue <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int fstat(int fd, struct stat *statbuf);
3. prot : PROT_READ (읽는 모드를 설정해준다.)
4. flags : MAP_SHARED
5. fd : fd
6. offset : 0 (파일의 처음부터 시작할 것이기 때문에)
5. 만약, map이 성공한다면 void 포인터로 주소 리턴을 해준다.
근데 파일의 내용이 결국 struct person의 연속된 값이기 때문에, 포인터를 그냥 받아오는게 아니라, struct person의 포인터를 받아오자.
에러처리를 해주자 : MAP_FAILED 가 return 되면 에러이다.
6. for 문을 이용해서 출력 해주자.
read API를 이용해서 하나씩 읽는게 아니라, 파일 전체에 대해서 하나의 메모리 주소로 매핑을 해와서, 실제 메모리상에 있는 데이터 struct를 조작하는 것처럼 p라는 포인터를 이용해서 파일의 내용을 탐색할 수 있다.
7. 완성된 전체 코드이다.
8. gcc 컴파일 한 뒤, 실행 시켜보자.
정상 출력 되는 것을 알 수 있다.
반응형
'리눅스 시스템 프로그래밍' 카테고리의 다른 글
#19 파일을 이용한 동기화 (실습) (2) | 2022.09.24 |
---|---|
#18 파일을 이용한 동기화(Race condition) (2) | 2022.09.23 |
#16 Memory map (2) | 2022.09.21 |
#15 디렉토리 다루기 (실습) (0) | 2022.09.20 |
#14 디렉토리 다루기 (2) | 2022.09.19 |
Comments