[완료] 커널에서 메모리 접근 문제입니다 ..

binoopang의 이미지

안녕하세요 ~!

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

위와 같이 나옵니다 ..

이 문제를 해결하는 방법이 있을까요??

아 그리구 제가 지금 하는 일(???)에 대해서 조언있으시면 부탁드립니다 ㅠ

powerson의 이미지

systemcall hooking을 하시려는 거 같은데요. http://linuxkernel.net에 이호님이 작성하신 systemcall hooking에 관련된 문서가 있으니 참고하시면 될 거 같습니다. 참고로 위와 같이 굳이 sys_open 등을 검색하지 않고, systemcall은 systemcall vector table이 있는데, 그 곳을 원하시는 함수 포인터로 수정하시면 됩니다.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

tokki2cut의 이미지

0xc0000000 ~ 0xdfffffff 의 나머지 영역을 저렇게 선형적으로 탐색할 수 있을까요? 개인적인 생각으로는 프로세스 2405 입장의 가상메모리이기 때문에, 물리 메모리에 매핑이 실제 매핑이 안되는 영역도 있을거라고 생각되는데.. 그래서 직접 건드리면 fault가 뜰 수 밖에 없다고 생각합니다. 메모리 구조체들을 뒤져서 가상메모리가 물리 메모리에 매핑된 영역을 뒤져서 건드려나가는 식으로 찾아보는 건 어떨까요?

함수 바이너리 패턴을 찾는 거 같은데, 특정 바이너리 패턴을 가지고 코드를 찾는 것은 우연찮게 어떤 코드가 우연찮게 똑같은 형태의 바이너리 코드를 메모리에 가지고 있을 확률도 염두에 두어야 한다고 생각해 봅니다.

binoopang의 이미지

tokki2cut 님의 말 대로 실제 매핑이 안된 부분이거나 권한문제 인것 같습니다.
이 문제는 특정 라이브러리 시작 주소를 알아내는 함수를 사용해서 해결 하였습니다. :D

답변 감사합니다 ^^

-------- 시그내쳐 ---------
열심히 열심히 열심히 ..
음악을 하는것 처럼!!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.