Physical memory 접근

andrea0403의 이미지

제가 이러한 쪽의 코딩을 전혀 안해봐서 감이 전혀 없어서
가능한지의 여부와 간단한 코드 요청드립니다.

어떠한 array가 있을때,
physical memory를 알아낸 후
physical memory로 다시 그 array에 접근해서 내용을 확인하는 것이
가능한가요?
가능하다면 전체 코드좀 요청드립니다..!

 의 이미지

어떤 플랫폼에서, 어떤 종류의 프로그래밍을 하고 계시는지에 따라 다릅니다.

익명 사용자의 이미지

Linux(Ubuntu)이고, user space에서 접근하려고 합니다

익명 사용자의 이미지

/proc/self/maps에서 현재 프로세스가 어떤 메모리 공간을 사용하고 있고 /dev/mem을 통해서 접근이 가능하긴 한데, 궁극적으로 무엇을 만드려고 하시는 건가요? 문제의 배열이 특정 프로세스에서 만들어진 거라면 그 프로세스가 죽은 후에는 그 메모리에 뭐가 올지 모릅니다. 게다가 요새의 리눅스라면 ASLR 때문에 원하시는 게 더 까다로울 겁니다.

익명 사용자의 이미지

그냥 현재는 그것이 가능한지 test를 해보려고 합니다.
혹시 그렇다면 그 메모리의 침범 여부를 알 수는 없나요?


1. array의 physical memory를 알아낸다.
2. physical memory의 침범 여부를 알 수 있다.
3. 다시 그 physical memory로 접근해 array의 내용을 받아온다.
입니다.

또 ASLR은 해제할 수 있는 것으로 검색되는데 맞나요?

jay94ks의 이미지

가능할겁니다.

커널 모듈에서 타깃 프로세스의 물리 메모리를 참조 하신다면 인텔 CPU 기준으로 Ring 0~3 사이에 끼여서 파생되는 문제는 발생하지 않을 겁니다. 다만 문제는 특정 프로세스가 점유하는 페이지는 가상 메모리고, 그 페이지가 맵핑되지 않은 상황에서는 거기 접근하면 Page Fault가 발생할거고 그러면 커널 전체가 맛탱이가 갈껍니다. 한마디로 안전하지 않다는 의미죠.

그러나 접근이 가능한지 확인하는 방법도 있고, 거기에 접근하는 방법도 당연히 있으며 특정 프로세스가 점유한 페이지들을 확인하는 방법도 있습니다. procfs로 사용자 영역이랑 IPC를 구성하는게 가능하며 퍼포먼스 드랍이나 여러가지 고려하면 또 다른 방향을 수립하는 것도 가능하실겁니다.

Pseudo code를 보시죠.

------------------------ 유져영역 메모리 카피하는 방법

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <asm/uaccess.h>
 
size_t dataxchg_user2kernel(void* kernel, const void* user, size_t length) {
	size_t sz = copy_from_user(kernel, user, length);
	return length - sz;
}
 
size_t dataxchg_kernel2user(void* user, const void* kernel, size_t length) {
	size_t sz = copy_to_user(user, kernel, length);
	return length - sz;
}

--------- proc fs 구성하는 방법

#include <linux/module.h>
#include <linux/kernel.h>
 
#include <linux/fs.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/jiffies.h>
#include <linux/unistd.h>
 
#include <asm/uaccess.h>
#include <kmodctl/kmodctlctl.h>
 
/*
 * this is for interacting the CLI interfaces.
 * */
 
static struct proc_dir_entry* kmodctl_file;
static struct file_operations kmodctl_fops = {
	.open = kmodctl_open,
	.read = kmodctl_read,
	.write = kmodctl_write,
	.release = kmodctl_close
};
 
KMOD_FORWARD int kmodctl_start(void) {
	kmodctl_file = proc_create_data("kmodctl",
			0, NULL, &kmodctl_fops, "kmodctl");
 
	if(!kmodctl_file) {
		printk(KERN_ERR "kmodctl_file: couldn't be started.\n");
		return -1;
	}
 
	proc_set_size(kmodctl_file, 80);
	return 0;
}
 
int kmodctl_end(void) {
	if(kmodctl_file)
		proc_remove(kmodctl_file);
 
	kmodctl_file = 0;
	return 0;
}

프로세스 메모리 맵핑 테이블 관련 내용은 좀더 찾아보셔야 할듯...!

H4N9U1의 이미지

저도 보안을 공부하면서 알게된거라 자세한 것은 잘 알지 못하지만,

리눅스 커널단에서 모듈로 mmap 핸들러를 제작 하신 다음에 해당 디바이스 드라이버 파일을 통해 유저엔드 소프트웨어에서 파일로 접근을 하면 된다고 알고있습니다.

보안 문서이기는 하지만... 어느정도 도움이 될 것 같아서 링크 공유해드립니다.

https://www.exploit-db.com/docs/english/42760-kernel-driver-mmap-handler-exploitation.pdf

강창현의 이미지

대충 10~100메가 정도 동적할당 해 놓고 삽입하는 데이터 크기가 오버플로우 될 때마다 다시 그만큼 동적할당해주면 됩니다. 또한 처음 메모리 주소값을 기준으로 버퍼 크기를 얻어 해당 데이터는 처음 주소값+버퍼 크기까지 할당되며 그 다음 데이터는 주소값+버퍼길이 만큼 되겠죠? 그런식으로 스택 또는 큐 형식으로 메모리에 원하시는 데이터 올리시면 됩니다. 삽입 삭제는 구현하기 나름이고요.. 이걸 또 공유 메모리로 만들면 해당 메모리에 접근할 때 세마포어,뮤텍스를 적절하게 사용해서 이중 읽기를 방지하기도 하구요. 아니면 댓으로 알려주세요~ ^^;;

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.