SOLVED: なぜセグフォ?
最近現実逃避が捗りすぎて困っている.
最近は低レベルのコードとかよくわからないので勉強している(遊んでいるだけ).
このC言語のソースコードは, x86_64のLinuxなら動く環境があると思う.
const unsigned char main[] = { 72, 199, 192, 1, 0, 0, 0, 72, 199, 195, 1, 0, 0, 0, 72, 141, 53, 21, 0, 0, 0, 72, 199, 194, 21, 0, 0, 0, 15, 5, 72, 199, 192, 60, 0, 0, 0, 72, 49, 255, 15, 5, 97, 108, 119, 97, 121, 115, 32, 109, 105, 115, 115, 32, 116, 104, 101, 32, 109, 97, 114, 107, 10 };
Wandboxでは動作した: https://wandbox.org/permlink/KeSJ6KkTDQGUXc3z
しかし自分の環境(Arch Linux)ではセグフォで落ちてしまう. main()に入った瞬間に落ちているようだ.
$ gdb ./a.out GNU gdb (GDB) 8.2 Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> ... (gdb) r Starting program: /tmp/tmp.lX2FcrqB9C/a.out Program received signal SIGSEGV, Segmentation fault. 0x0000555555556020 in main () (gdb) disass 0x0000555555556020 Dump of assembler code for function main: => 0x0000555555556020 <+0>: mov $0x1,%rax 0x0000555555556027 <+7>: mov $0x1,%rbx ... End of assembler dump. (gdb)
なんもわからん.完全に理解した.
おそらくExec Shieldが働いている(?)のでコンパイル時に-z execstack
を渡す必要がある.