問題タブ [execve]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
27386 参照

c - execve-そのようなファイルやディレクトリはありませんか?

execveで問題が発生しています。bashシェルと同じように機能するシェルを作成しようとしていますが、フォークされた子がコマンドを実行する際に問題が発生します。これが私が子供のために持っているものです。cmdは、ユーザーが入力したコマンドを含むchar *です。ただし、このプログラムを実行すると、perrorから次のエラーが発生します。

単純なlsを使用してプログラムを試しましたが、path = "/ bin / ls"を作成して実行する必要があります(これが私のlsコマンドの場所であることを確認しました)が、それでも文句を言います。私は何が間違っているのですか?ありがとう!

0 投票する
3 に答える
1720 参照

c - この単純なシェルコードcプログラムをターミナルからコンパイルするにはどうすればよいですか?

私はubuntu12のターミナルを使用してこれをコンパイルしようとしています:

この例はhttp://www.securitytube.net/video/235で見つけました。これは、AlephOneが「SmashingtheStack forFunandProfit」で使用したものでもあります。それ以来、多くの変化があったことを私は知っています。より簡単な例では、次のように使用しました。

gcc -ggdb -mpreferred-stack-boundary = 2 -fno-stack-protector filename filename.c

また、静的ユーティリティを含める場合もあります。上記のCコードをコンパイルしようとするまではうまくいきました。ターミナルから受け取るメッセージは次のとおりです。

これは非常に単純な例であり、このエラーはおそらくLinuxの現在の標準的なセキュリティ対策が原因であると理解していますが、今後はこの例などを使って練習していきたいと思います。誰かが助けることができれば、それは「粉砕」になります。

乾杯

0 投票する
1 に答える
487 参照

android - LinuxでAndroidエミュレーターのプロセスを実行するために「execve」を使用していますが、「avd」パスが間違っていますか?

Androidエミュレーターの実行について質問があります。詳細は以下のとおりです。どうもありがとう!

Androidエミュレーターを自動的に実行する必要があるため、Linuxで使用する傾向があるため、execve以下に示すソースコードを使用します。

コンソールには次が表示されます。PANIC: Could not open: /tmp/.android/avd/new1.ini

私のavd保存パスは~/.android/avdデフォルトです。しかし、新しいプロセスは、移植性の悪い avd ファイルを読み取るためのルート ファイルシステムのパスしか見つけません。実際にエミュレーターのプロセスが実行されました。環境変数の設定に集中しましたが、失敗しました。

環境変数の設定方法を教えてください。

0 投票する
1 に答える
886 参照

c - Linux でのメモリ マッピングの共有

動機

1 つのプログラムがデータを読み取って内部形式に転送し、もう 1 つのプログラムが内部形式を別のものに転送する、一対のプログラムを作成したいと考えています。演習として、パイプを使用せずにこれらのプログラム間の相互作用をコーディングしたいと思います。シグナルと共有メモリを使用するのが好きです。

私が欲しいもの

A が B を呼び出すプログラム A と B があります。

  1. プログラム A からメモリ ブロックを作成する
  2. プログラム A からプログラム B を呼び出し、メモリ ブロックの場所に関する情報を提供します。
  3. 両方のプログラムのメモリ ブロックを使用します。

より具体的には、A はカスタム ビデオ形式をデコードし、1 つの非圧縮フレームを共有バッファーに配置します。B はバッファから読み取り、それを出力ストリームにエンコードします。デコーダーは、約 500 MiB/秒のメモリ トラフィックである、1 秒あたり最大 100 フレームをデコードします。データを頻繁にコピーする必要があり、バッファが正確に大きくないため、パイプは遅いことが判明しました。

うまくいくと思うこと

私の考えはmmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0)、共有メモリのセクションを作成するために使用することです。問題は、次のexecve(2)状態のマンページです。

メモリ マッピングは保持されません (mmap(2))。

では、そのメモリを他のプログラムと共有するにはどうすればよいでしょうか。両方の機能を 1 つのプログラムに入れ、fork代わりに使用する方が良いでしょうか?

0 投票する
2 に答える
2675 参照

c - C および execve(3) 引数

strace(1)基本的に を使用するのと同じことを行うプロジェクトに取り組んでいptrace()ます。基本的に、実行可能ファイルを引数として受け取り、実行可能ファイルによって行われたシステム コールを出力する controller.c プログラムがあります (たとえば、% controller ls -l) を使用しexecve()て実行可能ファイルを実行していますが、少し問題があります。execve は次の引数を取ります

このインスタンスの filename は で"ls"ありargv[]、指定されたファイル名の引数のリストです。したがって、次のようなものがあります(Cファイル内)

実行可能ファイルを取得した場合、たとえばcontroller ls -lwhere argv[0] = "controller"argv[1] = "ls"およびargv[2] = "-l"の場合、「ARGUMENT LIST」で正しいパラメーターを渡すにはどうすればよいでしょうか (この場合の引数は単なる"-l"ものですが、それ以上になる可能性もあります)。

const char *基本的に、配列が実行可能ファイルの引数値を持つような型の配列を初期化するにはどうすればよいでしょうか? argv配列に余分な値があり、 ARGUMENT LIST の直前にあることを心配する必要さえありますか?

ご協力いただきありがとうございます!

0 投票する
2 に答える
521 参照

linux - フォーク後の Linux ユーザー空間 ELF ローダーの非常に奇妙な動作

次のコードを考えてみましょう (公共の要求によりコンパイルするために再訪しました:):

a.out プログラムは単純な main() { return 0; です。プログラム。

このコードをコンパイルして実行すると、子プロセスが、のfopen("log") 呼び出しによって開かれたファイルを mmap() しようとしたことがわかります。これは、失敗したアサーションによってわかります。

さらに調査したところ、これは子プロセスのロード中に発生することがわかりました。

これは 2 つの理由で奇妙です。

  1. fork() の後に発生したため、子供は fopen() 呼び出しにまったく気付かないはずです
  2. ローダーがこのファイルを mmap しようとするのはなぜですか? 実行可能ファイルでさえありません。

私は glibc で dl-load.c を見回しましたが、この種の動作を引き起こすものは何も見当たりませんでした。

何か案は?

ありがとう

0 投票する
1 に答える
211 参照

c - C: パラメータを指定して関数を宣言すると、その動作が変わります...?

私はシグナル、フォーク、および execve をいじっており、fork()別のおもちゃのプログラムを呼び出す子プロセスを作成するために使用するおもちゃのプログラムを作成しました。次に、親はアラームを設定して、特定の秒数後に関数を強制終了します。

奇妙な部分は次のとおりです。関数forkyMcFork()をパラメーターを取らないと宣言し、引数をalarm()手動で設定すると、期待どおりに機能します。子プロセスが開始problem5され、ユーザーからの入力が求められ、その後 3秒、killhandler実行し、子プロセスを見つけて強制終了します。

しかし、代わりに宣言しforkyMcFork(int secs)て使用すると、子プログラム内のステートメントalarm(secs)によって呼び出されるはずの外部プログラムが見つかりません。execve()アラームは期待どおりに実行されるため、数秒後に子プロセスが停止します。

動作しないコードは次のとおりです。

そして、これがその出力です:

明確にするために、ここでの唯一のコードの違いはforkyMcFork、 が taking として宣言されてvoidいる場合は動作するか、 take として宣言されてint secsいる場合は動作しないかです。どうしたの?

0 投票する
1 に答える
368 参照

linux-kernel - ptregs_execve と sys_execve の違い/関係は何ですか?

Linux 2.6.32 x86-32 でシステム コールをフックしています。

ただし、システム コール テーブルでは、 がではなく__NR_execveを指していることがわかりました。そして、どこにも関数定義が見つかりません。ptregs_execvesys_execveptregs_execve

ptregs_execveと sys_execveの違いや関係を明確にするのを手伝ってくれる人はいますか? umアーキテクチャについてptregs_execveは、 として定義されていることを知っていsys_execveます。他のアーキテクチャはどうですか?

0 投票する
1 に答える
2468 参照

assembly - execve シェルコード書き込みセグメンテーション違反

私はexecveシェルコードを研究しようとしていますが、

OS:Linux bt 2.6.39.4

root@bt:~/exploit# cat gshell.s

root@bt:~/exploit# as -gstabs -o gshell.o gshell.s

root@bt:~/exploit# ld -o gshell gshell.o

root@bt:~/exploit# ./gshell セグメンテーション違反 (コアダンプ) root@bt:~/exploit#

GDB:

(gdb) break *_start Breakpoint 1 at 0x8048054: ファイル gshell.s、6 行目。

(gdb) r プログラムの起動: /root/exploit/gshell

プログラム受信信号 SIGSEGV、セグメンテーション違反。shell () at gshell.s:14 14 movb %al,9(%esi)

(gdb) print /x $esi $1 = 0x804807a (gdb) x/16cb $esi 0x804807a : 47 '/' 98 'b' 105 'i' 110 'n' 47 '/' 98 'b' 97 'a' 115 's' 0x8048082 : 104 'h' 65 'A' 68 'D' 68 'D' 68 'D' 68 'D' 67 'C' 67 'C' (gdb)

上記の出力から、/bin/sh アドレスを ESI レジスタに正常に pope したようですが、0 を 9(%esi) に移動しようとすると、セグメンテーション違反が発生します。このプログラムを変更しようとさえしました: movl $0 から $esi. 0x804807a アドレスへの書き込みに制限されているかどうか知りたいですか? この障害の原因は何ですか?このシェルコードを正常に実行する方法

ありがとう、リトルジャック

0 投票する
1 に答える
906 参照

x86 - exec()システムコール引数によって使用されるレジスタ

exec()システムコールの引数がどのレジスタに格納されているかを知りたいのですが。

最初にexecシステムコールを実行する単純なCプログラムを実行し、そのオブジェクトダンプを取得したところ、実行するプロセスを含む引数にRDIが使用されており、カーネルでexecveを呼び出すためにsyscall命令が使用されていることがわかりました。私は64ビットのUbuntu12.04OSでこれを行いました

次に、QEMUで実行されているUbuntu 11.10 OS(32ビット)でこのプログラムを実行しました。しかし、現在、0x80のないオブジェクトダンプ割り込みが使用されており、引数はEBXにあります。

私は2つの面で混乱しています..なぜ1つの場所でint80が使用され、もう1つの場所でsyscallが使用され、execveシステムコールのレジスタがどのように選択されるのですか?