[완료] 커널에서 메모리 접근 문제입니다 ..
글쓴이: binoopang / 작성시간: 토, 2008/08/30 - 6:14오후
안녕하세요 ~!
void find_offset(void) { int cnt; unsigned int sys_offset; // sys_open 의 엔트리 주소 char pattern[] = "\x2e\x9d\x46\xc0"; sys_offset = 0xb0000000; for(cnt = 0 ; sys_offset < 0xbfffffff ; sys_offset++) { if(!strncmp((char *)sys_offset, pattern, strlen(pattern))) { printk(KERN_ALERT "[Module] Found!! 0x%x\n", sys_offset); } } }
위와 같은 코드를 짰습니다.
아 .. 먼저 하고자 하는것은 sys_open()의 주소를 담고있는 가상메모리 주소를 찾아서
그 주소에 내가 원하는 함수의 주소를 넣어주려고 ... (가능하긴 할까요??;;;) 하는데요 ㅋ
그러려면 먼저 커널 영역에서 sys_open의 주소를 검색해야 했습니다 ..
그래서 Sysmap으로 찾아낸 sys_open의 주소 0xc0469d2e를 임의의 범위 (현재 코드에서는 0xb0000000 ~ 0xbfffffff)에서
검색해서 일치하는 주소가 있으면 printk로 출력 하는 것입니다.
그런데 실제로 해보면 0xc0000000 ~ 0xdfffffff 은 정상적으로 작동하지만 나머지 영역에서는 커널 Oops가 발생합니다.
제 생각으로는 페이지에서 권한(읽기??)문제 같기도 한데요 ..
BUG: unable to handle kernel paging request at virtual address b0000000 printing eip: e0ae6034 *pde = 00000000 Oops: 0000 [#1] SMP last sysfs file: /devices/pci0000:00/0000:00:10.0/host0/target0:0:0/0:0:0:0/vendor Modules linked in: kprobe_hook(U) autofs4 hidp rfcomm l2cap bluetooth sunrpc ip_conntrack_ftp ip_conntrack_netbios_ns ipt_REJECT xt_state ip_conntrack nfnetlink iptable_filter ip_tables ip6t_REJECT xt_tcpudp ip6table_filter ip6_tables x_tables freq_table dm_multipath video sbs i2c_ec button battery ac ipv6 parport_pc lp parport sg floppy snd_ens1371 gameport snd_rawmidi snd_ac97_codec snd_ac97_bus snd_seq_dummy snd_seq_oss snd_seq_midi_event snd_seq snd_seq_device snd_pcm_oss pcspkr snd_mixer_oss snd_pcm snd_timer snd soundcore pcnet32 i2c_piix4 i2c_core mii snd_page_alloc ide_cd cdrom serio_raw dm_snapshot dm_zero dm_mirror dm_mod mptspi mptscsih mptbase scsi_transport_spi sd_mod scsi_mod ext3 jbd ehci_hcd ohci_hcd uhci_hcd CPU: 0 EIP: 0060:[<e0ae6034>] Not tainted VLI EFLAGS: 00010206 (2.6.18-1.2798.fc6 #1) EIP is at find_table+0x34/0x68 [kprobe_hook] eax: 00000000 ebx: b0000000 ecx: 00000003 edx: c9f4ceaf esi: b0000000 edi: c9f4ceaf ebp: ca552af4 esp: c9f4cea0 ds: 007b es: 007b ss: 0068 Process insmod (pid: 2405, ti=c9f4c000 task=d2eec8e0 task.ti=c9f4c000) Stack: c9f4cec8 00000026 ca552b20 2ef4cec8 00c0469d e0ae6800 ca552800 ca552b20 e0a760a0 e0ae6119 e0ae6068 c043b02d e0ae6848 c0623e21 e0ae680c e08facc0 c9f4cf64 ca058374 e0ae6800 00000000 00000000 00000000 00000000 00000000 Call Trace: [<e0a760a0>] init_module+0xa0/0xa5 [kprobe_hook] [<c043b02d>] sys_init_module+0x17db/0x1974 [<c0404027>] syscall_call+0x7/0xb DWARF2 unwinder stuck at syscall_call+0x7/0xb Leftover inexact backtrace: ======================= Code: ec 14 a1 51 61 ae e0 89 44 24 0f a0 55 61 ae e0 88 44 24 13 8d 54 24 0f 31 c0 83 c9 ff 89 d7 f2 ae f7 d1 49 89 de 89 d7 49 78 08 <ac> ae 75 08 84 c0 75 f5 31 c0 eb 04 19 c0 0c 01 85 c0 75 10 89 EIP: [<e0ae6034>] find_table+0x34/0x68 [kprobe_hook] SS:ESP 0068:c9f4cea0
위와 같이 나옵니다 ..
이 문제를 해결하는 방법이 있을까요??
아 그리구 제가 지금 하는 일(???)에 대해서 조언있으시면 부탁드립니다 ㅠ
Forums:
systemcall hooking을
systemcall hooking을 하시려는 거 같은데요. http://linuxkernel.net에 이호님이 작성하신 systemcall hooking에 관련된 문서가 있으니 참고하시면 될 거 같습니다. 참고로 위와 같이 굳이 sys_open 등을 검색하지 않고, systemcall은 systemcall vector table이 있는데, 그 곳을 원하시는 함수 포인터로 수정하시면 됩니다.
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
0xc0000000 ~ 0xdfffffff 의
0xc0000000 ~ 0xdfffffff 의 나머지 영역을 저렇게 선형적으로 탐색할 수 있을까요? 개인적인 생각으로는 프로세스 2405 입장의 가상메모리이기 때문에, 물리 메모리에 매핑이 실제 매핑이 안되는 영역도 있을거라고 생각되는데.. 그래서 직접 건드리면 fault가 뜰 수 밖에 없다고 생각합니다. 메모리 구조체들을 뒤져서 가상메모리가 물리 메모리에 매핑된 영역을 뒤져서 건드려나가는 식으로 찾아보는 건 어떨까요?
함수 바이너리 패턴을 찾는 거 같은데, 특정 바이너리 패턴을 가지고 코드를 찾는 것은 우연찮게 어떤 코드가 우연찮게 똑같은 형태의 바이너리 코드를 메모리에 가지고 있을 확률도 염두에 두어야 한다고 생각해 봅니다.
네 그런것 같아요 ..
tokki2cut 님의 말 대로 실제 매핑이 안된 부분이거나 권한문제 인것 같습니다.
이 문제는 특정 라이브러리 시작 주소를 알아내는 함수를 사용해서 해결 하였습니다. :D
답변 감사합니다 ^^
-------- 시그내쳐 ---------
열심히 열심히 열심히 ..
음악을 하는것 처럼!!
댓글 달기