環境変数の内部にシェルコードを含むシェルを生成するエクスプロイトを作成しようとしており、クリーンな環境ランチャーやGDBを使用しているので、変数が一番上にあります。
env -i MYVAR=10 gdb ./prog
問題は、GDBの内部にCOLUMNSとLINESという変数があり、次を使用して削除することです。
unset env COLUMNS
unset env LINES
次に環境を印刷します。
x/20s *((char **)environ)
これらの変数が表示され、同じアドレスの出力を生成し続けます。私はそれを使用して削除したことを知っています。
show env COLUMNS
変数が定義されていないというエラーを生成します。
削除された環境を表示せずに新しく更新された環境を表示するには?
私の目標は、GDBの外部でMYVARのアドレスを見つけることですが、プログラムを操作できないので、設定された変数を使わずにGDBの内部の環境をコピーするとアドレスを得ることができます。
ありがとう、ジョシュ
ベストアンサー1
環境は、execve()
プロセスがコマンドを実行したときに3番目の「envp」引数としてシステムコールに渡される2番目の文字列配列です。最初の引数は引数(「argv」)です。
規則に応じて、これらの文字列は次の形式に従いますvar=value
。
execve("/path/to/cmd", ["cmd", "arg1", "arg2"], ["var1=value1", "var2=value2"])
通常、他のコマンドが実行されると(通常はそのサブプロセスでは)、コマンドは実行時に受け取った環境文字列を実行するコマンドに渡します。execvp()
Cライブラリの関数はそれ自体がシステムコールを囲むラッパーであり、基本的にexecve()
これを行います。 Cライブラリ(コマンドがリンクされてもリンクされていなくても一般的にリンクされている)では、このenviron
変数は実行中に受信したenvp配列に基づいていっぱいになります。この変数は、execve()
// / ...および//配列更新によって後続のsからexecvp()
envpに渡されます。execlp()
system()
popen()
putenv()
setenv()
unsetenv()
environ
unset env var
inはgdb
これと同じことを行い(呼び出すこともできます)、起動時に受信したunsetenv()
文字列で始まる文字列は、これから実行されるコマンドに渡される配列に含まれないことを意味します。var=
gdb
envp
gdb
コマンドが実行されたら、libc do を使用して変数を埋めること(連想配列やシェルなどのシェルなどenvp
)を受け取った配列(スタックの一番下にある)を使用して、必要な操作をすべて実行できます。 libc doプログラムを使用するアプリ。ほとんどの環境変数のシェル変数名と互換性のある名前でシェル変数を生成します。environ
perl
%ENV