Pin tool 관련 질문 드립니다.

kwonsu의 이미지

안녕하십니까. 프로젝트에 사용하고자 pin tool을 보고 있는데요 예제 소스나 설명 부분을 보면 대충 어떤 의미인지 알것 같습니다.
궁금한것은 인터넷이나 intel에서 제공하는 예제소스를 봐도 이런 경우는 어떻게 처리하는지 몰라 문의드립니다.

1. 한 프로그램에서 system, exec.. 같은 command 실행 함수들이 있을 경우 특정 command가 실행되면 이것또한 추적이 가능한지요.
2. 추적이 가능하다면 system 함수등으로 실행된 binary도 심볼, 메모리 등등을 똑같이 추적이 가능한지요

방법이 있다면 어떤 방법으로 해야 할지요.
예를 들면 RTN_FindByName으로 함수를 찾아 PIN_CallApplicationFunction을 사용해서 추적한다는지 하는 방법이 궁금합니다.

고수님들의 조언 부탁드립니다.

익명 사용자의 이미지

probe mode를 사용하면, function call 전후로 hooking이 가능 합니다.
단순히 실행 여부를 알고 싶다면 probe mode에 대해서 분석해보세요.

pin/source/tools/Probes에 많은 예제가 있습니다.

kwonsu의 이미지

답변 감사합니다~~

거의 모든 예제들을 훑어봤는데 probe mode에도 제가 생각하는 방법을 찾지 못했습니다.
제가 생각하는 것은 아래와 같습니다.

1. system("daemon")을 응용 프로그램에서 실행했다고 가정한다.
2. system 함수를 사용하는 응용 프로그램 관련 심볼과 라이브러리, pid등등을 구하고 system 함수의 인자값인 "daemon"을 구한다.
3. "daemon" 프로그램이 실행되면 이 "daemon" 관련 심볼, 라이브러리, pid등등을 구한다.
4. "daemon" 프로그램에서 command 관련 함수가 있다면 위와 같은 작업을 반복 실행한다.

이게 가능할것 같은데 예제로 삽질하는것은 당연하겠지만 어떤 방법으로 위와 같은 방식을 취해야 할지 방법론을 잘 모르겠습니다.

조금 더 도움을 부탁드립니다.

지식의 여인은 옷을 쉽게 벗지 않는다.
잡초인생. 잡초처럼 끈길기게....

cocom12의 이미지

혹시 PIN에서 함수의 시작점과 끝점을 알 수 있는 방법이 있을까요?
예를 들면.

int main()
{
......
......
}

이렇게 되어 있다면 바이너리 코드로 함수의 시작점과 끝점을 출력하는 방법이 뭐가 있을까요?
답변 좀 부탁드리겠습니다..ㅠㅠ

익명 사용자의 이미지

제가 이해한 범위 내에서 몇자 적어 봅니다.

1. 모든 데몬에 대해서 system함수를 hooking한다. 그러면 system함수가 호출 될때 후킹 함수로 파라메터를 전달 받으므로, 이를 분석한다.
probe mode에서 후킹 함수는 원본 함수와 동일한 모양으로 만들어져야 합니다. 그러므로 후킹 함수는 대략 이런 모양이겠죠. system_before_hooking(const char *cmd)

2. 정확한 목적이 이해가 안됩니다. 찾고자 하는 함수를 사용하는지 여부는 RTN_FindByName()함수로 모두 알수 있습니다.
검사의 대상이 되는 프로그램에 probe mode로 검사하면 원하는 무엇이든 할 수있습니다.

3. 데몬 형태로 구동 되는 프로세스에는 attach 를 시켜서 probe mode를 실행 할수 있습니다.

4. command 관련 함수라 함은 system() 계열의 함수를 말하는 거죠? 원하는 모든 함수에 대해서 hooking을 걸면 되겠죠...

제가 사용하는 probe mode의 용도는 데몬으로 실행 되는 프로그램에 런타임에 함수를 후킹해서 입력되는 파라메터 값을 출력하고,
함수 수행이 끝나고 나면 리턴 값을 출력하는 함수 모듈 테스트를 하는 용도로 사용 합니다.
그러므로 데몬을 구성하고 있는 모든 함수가 probe mode에서 후킹이 가능 합니다.

kwonsu의 이미지

님의 답변에 많은 도움을 받고 있습니다. 다시한번 감사의 말씀드립니다.

목적은 특정 바이너리 파일에서 심볼, 라이브러리, 네트워크, 기타 event( fd read/write )등을 추적 할때 특정 바이너리에서
command 명령을 실행하기 위해서 system 또는 execl/execve 같은 함수를 사용할 경우 이 함수로 실행된
바이너리 파일도 실행하면서 똑같이 추적이 가능한지 궁금합니다.
예를 들면

binary 1 : first ( execve(second) 실행 )
binary 2 : second ( system(third) 실행 )
binary 3 : third

위와 같은 순서로 실행된다면

1. first 바이너리 추적 : 심볼, 라이브러리, 네트워크 추적/pid 가져오기
--------------------> execve(second)발견
2. second 프로그램 추적 : 심볼, 라이브러리, 네트워크 추적/pid 가져오기
--------------------> system(third)발견
3. third 프로그램 추적 : 심볼, 라이브러리, 네트워크 추적/pid 가져오기

위와 같은 순서로 추적이 가능한지요.

pin tool의 예제 소스 중에 source/tools/Probes/unix_parent_tool.cpp 파일에서 아래와 같은 부분이 있습니다.

 97 int myexecve(const char * __path, char *const* __argv, char *const* __envp)
 98 {
 99    cout << "myexecve called " << endl;
100    int res = fptrexecve(__path, __argv, __envp);
101
102    return res;
103 }

제가 아는 바로는 RTN_FindByName로 myexecve 함수를 찾아 RTN_ReplaceProbed로 해당 함수에 진입점을 찾고 실행한다라고 알고 있습니다.
위 예제에서 fptrexecve(__path, __argv, __envp)로 실행되는 또다른 바이너리를 같은 방법으로 다시 추적할 수 있는 방법이 궁금합니다.

답변 부탁드립니다.

지식의 여인은 옷을 쉽게 벗지 않는다.
잡초인생. 잡초처럼 끈길기게....

익명 사용자의 이미지

원하는 목적에 딱 맞는 기능은 없을듯 합니다.
(제가 pin을 모두 아는 것이 아니라서)

다만, system()계열의 함수는 모두 fork()를 실행하므로 fork()함수의 리턴을 후킹하고,
이때 얻어진 pid를 이용해서 새로 생성된 프로세스에 다시 pin 툴을 attach 시키면 되지 않을까 합니다.

kwonsu의 이미지

여러가지 도움을 주셔서 감사합니다.
삽 하나 들고 시작해봐야겠습니다.
성공하게 되면 답글로 달겠습니다. ^^
그런데 다시 attach를 시키는 방법은 어떤 방법을 사용하는지요.

그럼 수고하십시요.

지식의 여인은 옷을 쉽게 벗지 않는다.
잡초인생. 잡초처럼 끈길기게....

kwonsu의 이미지

pin tool 예제 소스 중에 ./Probes/unix_parent_tool.cpp 소스를 참고 했습니다.
제가 해본 것은 Probe 모드로 하지 않고 아래와 같은 방법으로 하였습니다.

#include <fstream>
#include <iomanip>
#include <iostream>
#include <string.h>
#include "pin.H"
 
int (*fptsystem)(const char *);
 
int mysystem(const char * cmd)
{
   char buff[1024];
 
   sprintf(buff, "../../../pin -follow_execv -t ./obj-intel64/test.so -- %s", cmd );
   int res = fptsystem(buff);
   cout << "buff : " << buff << endl;
 
   return res;
}
 
VOID ImageLoad(IMG img, VOID *v)
{
    if ( (IMG_Name(img).find("libc.so") != string::npos) ||
         (IMG_Name(img).find("LIBC.SO") != string::npos) ||
         (IMG_Name(img).find("LIBC.so") != string::npos) )
    {  // check that tool can also probe execve successfully
        RTN rtnsystem = RTN_FindByName(img, "system");
        if (RTN_Valid(rtnsystem) && RTN_IsSafeForProbedReplacement(mysystem))
        {
            cout << "Inserting probe for system at " << hex << RTN_Address(mysystem) << endl;
            AFUNPTR fptr = (RTN_ReplaceProbed(rtnsystem, AFUNPTR(mysystem)));
            fptsystem = (int (*)(__const char *))fptr;
        }
    }
}
 
 
int main(int argc, char * argv[])
{
    // Initialize symbol table code, needed for rtn instrumentation
    PIN_InitSymbols();
 
    // Initialize pin
    if (PIN_Init(argc, argv)) return Usage();
 
    // Register ImageLoad to be called when an image is loaded
    IMG_AddInstrumentFunction(ImageLoad, 0);
 
    // Register Fini to be called when the application exits
    PIN_AddFiniFunction(Fini, 0);
 
    // Start the program, never returns
    PIN_StartProgram();
 
    return 0;

대충 저런 식으로 했습니다.
system 함수의 argument 값을 구하고 이걸 다시 실행 하는 방법으로 사용했습니다.
결과는 잘 나오는 것으로 확인했습니다. 이 방법 뿐인지는 확인해 봐야 하겠습니다만 별다른 방법이 없으면 이 방법으로 사용할까 합니다.

다시한번 도움 주셔서 감사합니다~~

지식의 여인은 옷을 쉽게 벗지 않는다.
잡초인생. 잡초처럼 끈길기게....

댓글 달기

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