問題タブ [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.
c - execve-そのようなファイルやディレクトリはありませんか?
execveで問題が発生しています。bashシェルと同じように機能するシェルを作成しようとしていますが、フォークされた子がコマンドを実行する際に問題が発生します。これが私が子供のために持っているものです。cmdは、ユーザーが入力したコマンドを含むchar *です。ただし、このプログラムを実行すると、perrorから次のエラーが発生します。
単純なlsを使用してプログラムを試しましたが、path = "/ bin / ls"を作成して実行する必要があります(これが私のlsコマンドの場所であることを確認しました)が、それでも文句を言います。私は何が間違っているのですか?ありがとう!
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の現在の標準的なセキュリティ対策が原因であると理解していますが、今後はこの例などを使って練習していきたいと思います。誰かが助けることができれば、それは「粉砕」になります。
乾杯
android - LinuxでAndroidエミュレーターのプロセスを実行するために「execve」を使用していますが、「avd」パスが間違っていますか?
Androidエミュレーターの実行について質問があります。詳細は以下のとおりです。どうもありがとう!
Androidエミュレーターを自動的に実行する必要があるため、Linuxで使用する傾向があるため、execve
以下に示すソースコードを使用します。
コンソールには次が表示されます。PANIC: Could not open: /tmp/.android/avd/new1.ini
私のavd保存パスは~/.android/avd
デフォルトです。しかし、新しいプロセスは、移植性の悪い avd ファイルを読み取るためのルート ファイルシステムのパスしか見つけません。実際にエミュレーターのプロセスが実行されました。環境変数の設定に集中しましたが、失敗しました。
環境変数の設定方法を教えてください。
c - Linux でのメモリ マッピングの共有
動機
1 つのプログラムがデータを読み取って内部形式に転送し、もう 1 つのプログラムが内部形式を別のものに転送する、一対のプログラムを作成したいと考えています。演習として、パイプを使用せずにこれらのプログラム間の相互作用をコーディングしたいと思います。シグナルと共有メモリを使用するのが好きです。
私が欲しいもの
A が B を呼び出すプログラム A と B があります。
- プログラム A からメモリ ブロックを作成する
- プログラム A からプログラム B を呼び出し、メモリ ブロックの場所に関する情報を提供します。
- 両方のプログラムのメモリ ブロックを使用します。
より具体的には、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
代わりに使用する方が良いでしょうか?
c - C および execve(3) 引数
strace(1)
基本的に を使用するのと同じことを行うプロジェクトに取り組んでいptrace()
ます。基本的に、実行可能ファイルを引数として受け取り、実行可能ファイルによって行われたシステム コールを出力する controller.c プログラムがあります (たとえば、% controller ls -l
) を使用しexecve()
て実行可能ファイルを実行していますが、少し問題があります。execve は次の引数を取ります
このインスタンスの filename は で"ls"
ありargv[]
、指定されたファイル名の引数のリストです。したがって、次のようなものがあります(Cファイル内)
実行可能ファイルを取得した場合、たとえばcontroller ls -l
、where argv[0] = "controller"
、argv[1] = "ls"
およびargv[2] = "-l"
の場合、「ARGUMENT LIST」で正しいパラメーターを渡すにはどうすればよいでしょうか (この場合の引数は単なる"-l"
ものですが、それ以上になる可能性もあります)。
const char *
基本的に、配列が実行可能ファイルの引数値を持つような型の配列を初期化するにはどうすればよいでしょうか? argv
配列に余分な値があり、 ARGUMENT LIST の直前にあることを心配する必要さえありますか?
ご協力いただきありがとうございます!
linux - フォーク後の Linux ユーザー空間 ELF ローダーの非常に奇妙な動作
次のコードを考えてみましょう (公共の要求によりコンパイルするために再訪しました:):
a.out プログラムは単純な main() { return 0; です。プログラム。
このコードをコンパイルして実行すると、子プロセスが、親のfopen("log") 呼び出しによって開かれたファイルを mmap() しようとしたことがわかります。これは、失敗したアサーションによってわかります。
さらに調査したところ、これは子プロセスのロード中に発生することがわかりました。
これは 2 つの理由で奇妙です。
- fork() の後に発生したため、子供は fopen() 呼び出しにまったく気付かないはずです
- ローダーがこのファイルを mmap しようとするのはなぜですか? 実行可能ファイルでさえありません。
私は glibc で dl-load.c を見回しましたが、この種の動作を引き起こすものは何も見当たりませんでした。
何か案は?
ありがとう
c - C: パラメータを指定して関数を宣言すると、その動作が変わります...?
私はシグナル、フォーク、および execve をいじっており、fork()
別のおもちゃのプログラムを呼び出す子プロセスを作成するために使用するおもちゃのプログラムを作成しました。次に、親はアラームを設定して、特定の秒数後に関数を強制終了します。
奇妙な部分は次のとおりです。関数forkyMcFork()
をパラメーターを取らないと宣言し、引数をalarm()
手動で設定すると、期待どおりに機能します。子プロセスが開始problem5
され、ユーザーからの入力が求められ、その後 3秒、killhandler
実行し、子プロセスを見つけて強制終了します。
しかし、代わりに宣言しforkyMcFork(int secs)
て使用すると、子プログラム内のステートメントalarm(secs)
によって呼び出されるはずの外部プログラムが見つかりません。execve()
アラームは期待どおりに実行されるため、数秒後に子プロセスが停止します。
動作しないコードは次のとおりです。
そして、これがその出力です:
明確にするために、ここでの唯一のコードの違いはforkyMcFork
、 が taking として宣言されてvoid
いる場合は動作するか、 take として宣言されてint secs
いる場合は動作しないかです。どうしたの?
linux-kernel - ptregs_execve と sys_execve の違い/関係は何ですか?
Linux 2.6.32 x86-32 でシステム コールをフックしています。
ただし、システム コール テーブルでは、 がではなく__NR_execve
を指していることがわかりました。そして、どこにも関数定義が見つかりません。ptregs_execve
sys_execve
ptregs_execve
ptregs_execve
と sys_execveの違いや関係を明確にするのを手伝ってくれる人はいますか? umアーキテクチャについてptregs_execve
は、 として定義されていることを知っていsys_execve
ます。他のアーキテクチャはどうですか?
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 アドレスへの書き込みに制限されているかどうか知りたいですか? この障害の原因は何ですか?このシェルコードを正常に実行する方法
ありがとう、リトルジャック
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システムコールのレジスタがどのように選択されるのですか?