System cAll Wrapping 하는 방법을.... 찾아야 합니다 ㅠㅠ

yanns의 이미지


우선, 제목에 쓴 말이 맞는 말인지도 모르겠습니다.
정확히는 System Call을 우회 하는 방법을 찾아야 합니다.

예를들어서, Socket 프로그램밍을 하는데 보통 데이터를 보내고 받기를 하는데 system call function을 사용하게 됩니다. send, sendto, write 등등, 여러가지가 있겠죠.. 이들을 바로 libc의 system call interfacing 하지 않고(보통 이렇게 해서 packet들이 만들어져서 나가고 들어 오겠죠...), 제가 어떤 작업을 더 한 다음, libc를 통해서 나가게 하려고 합니다.

현재, 제가 사용하고 있는 배포판은 우분투 엣지 2.6 사용하고 있습니다.
검색을 해보았으나.. 직접적인 언급은... 없는걸 확인했습니다. 저와 비슷한 질문을 하신분도 있으신데, 그 스레는 달랑 질문 글만 있네요... 아하하하 ;;; 그럼, 고수분들의 답변 ㅠㅠ 기대하겠습니다!!!

bushi의 이미지

LD_PRELOAD

[bushi@rose net]$ cat wrap.c
#include <stdio.h>
#include <sys/types.h>
#include <dlfcn.h>
#include <errno.h>
 
#define LIB "libc.so.6"
 
ssize_t read(int fd, void *buf, size_t count)
{
        ssize_t (*orig_func) (int fd, void *buf, size_t count);
        void *dl_handle;
        ssize_t ret;
 
        printf("fd = %d, buf = %p, count = %d\n",
                        fd, buf, count);
 
        dl_handle = dlopen(LIB, RTLD_NOW);
        if (!dl_handle) {
                printf("%s: %s\n", LIB, dlerror());
                return -EINVAL;
        }
 
        orig_func = dlsym(dl_handle, __func__);
        if (!orig_func) {
                printf("%s: %s\n", __func__, dlerror());
                dlclose(dl_handle);
                return -EINVAL;
        }
 
        ret = (orig_func)(fd, buf, count);
        dlclose(dl_handle);
        return ret;
}
[bushi@rose net]$
[bushi@rose net]$ gcc -shared -o libwrap.so wrap.c -ldl -Wall
[bushi@rose net]$

테스트

[bushi@rose net]$ cat wrap_test.c
#include <unistd.h>
 
int main(int argc, char **argv)
{
        return read(-1, NULL, 0);
}
[bushi@rose net]$
[bushi@rose net]$ gcc -s -o wrap_test wrap_test.c -Wall
[bushi@rose net]$
[bushi@rose net]$ ./wrap_test
[bushi@rose net]$
[bushi@rose net]$ LD_PRELOAD=`pwd`/libwrap.so ./wrap_test
fd = -1, buf = (nil), count = 0
[bushi@rose net]$

---
버그 수정했습니다. =.=

yanns의 이미지

하하 예제까지.. ㅋㅋ
테스트했습니다~
감사합니다~ ^_^

PS : 사족으로, Xen이나 VirtualBox 같은 Virtualizer들은 이런 형식으로 각각의 Instance들에서 동작하는 application들의 System call을 관리 할까요? 흠...

댓글 달기

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