[kernel] addr_limit : kernel space arg
addr_limit
/source/arch/x86/include/asm/processor.h#L421
```c
typedef struct {
unsigned long seg;
} mm_segment_t;
struct thread_struct {
...
mm_segment_t addr_limit;
...
};
```
* 기본값은 ``c addr_limit==PAGE_OFFSET``이다.
/source/arch/x86/include/asm/uaccess.h#L27
```c
#define get_ds() (KERNEL_DS) // == MAKE_MM_SEG(-1UL)
#define get_fs() (current->thread.addr_limit)
#define set_fs(x) (current->thread.addr_limit = (x))
```
```c
#include <asm/uaccess.h>
mm_segment_t orig_fs;
orig_fs = get_fs();
set_fs(get_ds());
/* do something */
set_fs(orig_fs);
```
Note ) 현재 thread에 대해서 `` addr_limit``를 수정하는 것이기 때문에, 시스템 전역적으로 적용되는 것이 아니다.
```
e.g.
[ user space data가 들어가야 할 자리에 kernel space data가 들어가는 경우 : ]
```c
asmlinkage long hook_sys_write(unsigned int fd, char __user *buf, size_t count){
if (!strcmp(buf, "bum")){
printk("hook");
return orig_sys_write(fd, "BUM", count);
}
return orig_sys_write(fd, buf, count);
}
```
```bash
root@kali32:~/lkm/addr_limit/write_hook# ../../write_test
bum
root@kali32:~/lkm/addr_limit/write_hook# insmod sys_hook.ko
root@kali32:~/lkm/addr_limit/write_hook# ../../write_test
root@kali32:~/lkm/addr_limit/write_hook# rmmod sys_hook
root@kali32:~/lkm/addr_limit/write_hook# ../../write_test
bum
root@kali32:~/lkm/addr_limit/write_hook# dmesg | tail -5
[112700.607849] b_hook LKM is loaded
[112700.607851] sct[__NR_write(4)] c95d3170 : c91dc6e0 : 26748d3e
[112700.607852] sct[__NR_write(4)] c95d3170 : f970c000 : 26748d3e
[112702.850690] hook
[112706.057887] b_hook LKM is removed.
```
``bash dmesg``가 제대로 찍히는 것을 보면 LKM은 제대로 동작했는데, ``c orig_sys_write()``에서 제대로 출력되지 않은 것 같다.
* 사실 이런 종류의 문자열 수정은 그냥 ``c buf[0]``으로 접근하면 addr_limit 설정이 필요 없기는 하다.
[ addr_limit를 해제한 경우 : ]
```bash
root@kali32:~/lkm/addr_limit/write_hook# insmod sys_hook.ko
root@kali32:~/lkm/addr_limit/write_hook# ../../write_test
BUM
```
'OS > Kernel' 카테고리의 다른 글
[kernel] get sys_call_table (0) | 2017.10.16 |
---|---|
[kernel] Page Protection (0) | 2017.10.16 |
[kernel] LKM, Loadable Kernel Module / Kernel Compile (0) | 2017.10.14 |
[kernel] virt_to_phys (0) | 2017.10.13 |
[kernel] exploit (0) | 2017.10.06 |