プログラミング初心者なので暖かい目で見ていただけると幸いです。
execve("/bin/sh", ["/bin/sh", NULL], NULL)を16進数に変換し、C言語で呼び出すことで、シェルを立ち上げるというやり方について、少し疑問があったので質問させていただきます。
#include <stdio.h> typedef void (*func)(); char shellcode[] = "\x31\xd2\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80"; int main(void) { ((func)&shellcode)(); // ((func)shellcode)(); // こっちでも呼び出せる?? return 0; }
16進数をリトルエンディアンで文字列としてグローバル変数shellcodeに定義しておき、main関数内で呼び出しを行っています。
簡単のため、事前にtypedefにより、
引数を取らず、void型を返す関数へのポインタ型をfunc型
と定義しています。
私は、アスタリスク演算子はメモリ上のその変数がある番地の値を取得、アンパサンド演算子はメモリ上のその変数がある番地を取得(この部分について、少し自信がないので今回質問させていただきました)していると考えているのですが、
番地でも、その番地に格納された値でもfunc型にキャストして関数呼び出しができてしまうのは何故なのでしょうか?
ポインタの初歩的なところでつまづいてしまっていますが、どなたかご教授いただけないでしょうか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/01/29 06:54
2016/02/07 16:05