TL;DR
amd64のUbuntuにて、マルチアーキテクチャ(i386)の設定がされておらず、i386向けのライブラリが不足していたというオチです...。
参考になりそうでしたら続きをご覧ください!
事象
Ubuntu22.04環境で32bitのELFを実行したら以下のようなエラーが出た。
$ ./orw bash: ./orw: No such file or directory $ file ./orw orw: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=e60ecccd9d01c8217387e8b77e9261a1f36b5030, not stripped
原因
ELFに動的リンクされている/lib/ld-linux.so.2が存在していなかった。前述のファイルコマンドのdynamically linked, interpreter /lib/ld-linux.so.2の部分。
ld-linux.so.2はi386アーキテクチャに必要なライブラリで,i386に対応した環境であれば以下のようなシンボリックリンクが貼られている。
$ ls -la /lib/ld-linux.so.2 lrwxrwxrwx 1 root root 28 Nov 22 2023 /lib/ld-linux.so.2 -> i386-linux-gnu/ld-linux.so.2
64bit環境でi386アーキテクチャに対応していない(マルチアーキテクチャの設定がされてない)場合,このようにi386向けにコンパイルされたELFに必要なライブラリが存在しない場合がある。
# マルチアーキテクチャ(i386)の設定ができている場合 $ dpkg --print-architecture amd64 $ dpkg --print-foreign-architectures i386 # マルチアーキテクチャ(i386)の設定ができていない場合 $ dpkg --print-architecture amd64 $ dpkg --print-foreign-architectures (何も表示されない)
対処
マルチアーキテクチャの設定をすればよい。
# アーキテクチャの追加.これによりi386に必要なライブラリをインストールできるようになる。 $ sudo dpkg --add-architecture i386 # 必要なライブラリのインストール $ sudo apt install libc6:i386 # ld-linux.so.2が入ったことを確認 $ ls /lib/ld*
余談
Pwnの問題を解きたくてpwnable.twをやっていた時に起きた出来事でした.静的リンクされてる問題ファイルは実行できていたので,全く気付かなかったです...(エラーメッセージで「ld-linux.so.2が無い」と言ってくれればすぐ気付いたのに...)
あと,M1 MacのUTMでUbuntu22.04 amd64をエミュレートしていたので,最初はそれが悪いのかなとか色々考えちゃいました.(M1 Macだとアーキテクチャ依存の問題をめちゃくちゃ踏んでしまうしエミュレートはパフォーマンスが著しく下がってしまうので,超不便だなと思っていたのですが,CUIしか使わなければUTMのエミュレートでも結構快適に作業できていいじゃんって、最近思いました.)