4

Ptrace を使用して次のことを行うプログラムを作成しています。

  • 現在の eax を読み取り、システム コールが sys_open かどうかをチェックします。
  • もしそうなら、渡された引数が何であるかを知る必要があります。

    int sys_open(const char * filename, const int mode, const int mask)

したがって、eax = 5 は、それがオープン システム コールであることを意味します。この質問
から、ebx がファイルの場所のアドレスを持っていることがわかり ました。同じ質問 1質問 2 に対処する次の質問に出くわしました(これは私だけのものです!) しかし、それでも問題の解決策が得られませんでした。:(両方の答えが明確ではなかったので。質問1のアプローチを試してみると、まだセグメンテーション違反が発生しています。ここで 私のコードを確認できます 。





4

1 に答える 1

4

ご存知sys_open()のように、ファイル名のサイズをパラメータとして受け取りません。ただし、標準では、リテラル文字列は文字で終了する必要があるとされてい\0ます。これは朗報です。文字列の文字を反復処理する単純なループを実行できるようになり、\0(NULL)文字が見つかると、文字列の最後に到達したことがわかります。

これが標準の手順であり、その方法であり、 stracestrlen()の方法でもあります。

Cの例:

#include <stdio.h>

int main()
{
    const char* filename = "/etc/somefile";

    int fname_length = 0;
    for (int i = 0; filename[i] != '\0'; i++)
    {
        fname_length++;
    }

    printf("Found %d chars in: %s\n", fname_length, filename);

    return 0;
}

手元のタスクに戻るには、のアドレスにアクセスして、filename今説明した手順を実行する必要があります。これはあなたがしなければならないことであり、他の方法はありません。

于 2012-03-21T12:33:48.987 に答える