メモリダンプ解析 - linux -

はじめに

なぜメモリダンプをするのかや何ができるのかなどはリンク先に書いてあるので 省略する.

Tools

  • LiME(Linux Memory Extractor)
  • volatility

使い方

Prerequisites

sudo apt install -y linux-headers-$(uname -r)
sudo apt install -y build-essential
sudo apt install -y dwarfdump pcregrep libpcre++-dev python-dev python-pip
pip install pycrypto Distorm3 OpenPyxl ujson

Downloads & Build

LiME

git clone https://github.com/504ensicsLabs/LiME
cd LiME/src/
make

volatility

git clone https://github.com/volatilityfoundation/volatility
cd volatility/tools/linux
sudo make -C /lib/modules/$(uname -r)/build CONFIG_DEBUG_INFO=y M=$PWD modules
dwarfdump -di ./module.o > module.dwarf
sudo zip Debian4908.zip module.dwarf /boot/System.map-$(uname -r)
cd ../../ # move to project root
cp tools/linux/Debian4908.zip volatility/plugins/overlays/linux/

dump

sudo insmod lime-$(uname -r).ko "path=dump.mem format=lime timeout=0"
OR
sudo insmod lime-$(uname -r).ko "path=tcp:4444 format=lime timeout=0"
nc 10.10.1.10 4444 > dump.mem

# cleanup
sudo rmmod lime

analysis

# how to use vol.py
python vol.py --info 
# test
python vol.py --plugins=contrib/plugins -f debian-latest.lime --profile=LinuxDebian4908x64 linux_banner

リンク

Intelij 系IDE 出来ること・操作

背景

Android StudioくらいしかIDEを使っていなかったが,学生はJetBrainsのIDEを無料で使えるのでずっと活用したいと思っていた. はじめは操作が分からず使いづらかったが,慣れるとこれ無しではコードを書いたり探索したりするのになくてはならないもの になってきた.Intelij系は操作感を共通にできるので1つ覚えれば他のIDEでも使えるのがよい.

CLion

現在はC言語を扱うことが多いのでCLionというC/C++のためのIDEを使う. Projectを開くとCMakefileを検知したりコードのインデックスをとって検索の高速化をしてるようだ. CMakefileで管理されていないプロジェクトを使うときはMakefileを扱うためにPluginをFile->Settings->PlugingsからMakefileで検索してインストールすればいい.CMakeはよくわからない人でMakefileを使わずに単一ファイルで実行したいときは同じくPluginsからC/C++ Single File Executionをインストールする. これらの昨日がデフォルトで入っていたら最初に迷うことがなかった気がする. Single File Executionの使い方は 1. CMakeList.txtをプロジェクトルートに作成して例のように設定する.

cmake_minimum_required(VERSION 3.14)
project(main)

set(CMAKE_CXX_STANDARD 14)
  1. .cファイルをProjectツリーから開いてエディタの中で右クリック->Add executable for single c/cpp fileを選択する. これによってCMakeList.txtに次の一行が追加される.
add_executable(main main.cpp)
  1. build押す(Ctrl+F9)

  2. Run(Shift+F10)

ショートカットは設定次第で異なるかもしれない.

続き

TBD

ラズパイ(ARM, aarch64) システムコール追加 Adding a system call to aarch64 Linux

背景

x86システムコール追加はよく見るけどarmでやったことは無かった. 調べてもなかなか出てこなかったので残しておく.

変更例

#include <linux/kernel.h>
#include <linux/syscalls.h>

SYSCALL_DEFINE2(newsyscall, int, a, int, b)
{
   printk(KERN_EMERG "newsyscall is called (pid = %d)\n", current->pid);
   return a + b;
}
  • linux/include/uapi/asm-generic/unistd.h
#define __NR_newsyscalls 292
__SYSCALL(__NR_newsyscall, sys_newsyscall)

#define __NR_syscalls 293 /* 元が292だったので+1しておく */

以上.

Raspbian GLIBC upgrade (2.24 -> 2.28 )

背景

諸事情あってGLIBCが2.28出ないと動かないプログラムをraspbianで動かしたかった。 しかしstretchには2.28がない、ソースからのビルドも失敗という状況

解決策

次のRaspbianのバージョンbusterのリポジトリには2.28があるという情報をみたのでaptのソースに追加してインストールした。

$ echo "deb http://ftp.jaist.ac.jp/raspbian/ buster main" >> /etc/apt/sources.list
$ apt update && apt -y install libc-bin

このときapt upgradeすると色々影響が出るかもしれないのでそっとしておき、/etc/apt/sources.listを元に戻した。

Androidアプリ開発環境

環境

インストール手順

## android studio
$ sudo snap install android-studio --classic
## sdkman
$ curl -s https://get.sdkman.io | bash
$ source $HOME/.sdkman/bin/sdkman-init.sh
## sdkman経由でjava, kotlin, gradle
$ sdk install java
($ sdk list java)                # version確認
($ sdk install java 9.0.4-open)  # 特定versionインストール
($ sdk default <candidate> [version])  # default versionをセット
$ sdk install kotlin
$ sdk install gradle
## android studio関係(kvm, Inotify Watches Limit)
$ sudo apt install qemu-kvm
$ sudo vim /etc/sysctl.conf
fs.inotify.max_user_watches = 524288
$ sudo sysctl -p --system

エディタの話(spacemacs)

背景(日記)

もう流行りは過ぎてると思うがSPACEMACSに今頃乗り換えた. 背景としてはemacsを3年くらい拡張して満足行っていたがしばらくしたらメンテナンスしてないせいで自分の設定を忘れたり, 重いと思ったり,使わないものが多かったりしていつものことだが再構成をする時期になった. するとvimキーバインドを使えるemacsで人気のSPACEMACSがよいという記事が多数あり,影響されて導入してみた.

設定

初期設定をVim, standard edition, helmにしてしばらく待つ.次に日本語入力のためのmozcを設定,またスタート画面にCannot find any of the specified fonts (Source Code Pro)! Font settings may not be correct.とでたので 一応Source Code Proをインストールした.

所感

なんとなく触っても結構思い通りに操作できる.しかし,emacsvimをそれぞれある程度は触っていないと大変かもしれないと思った. まだ自分も概念がよくわかっていなくてあれ?となることもあるけどVimのテキスト編集の素晴らしさとemacsのorg,パッケージ管理を使えるだけでいいエディタだと思う.

Chainerで画像のキャプション生成

きっかけ

パターン認識の講義でなにかツールを使って自分で動かした 結果をレポートにまとめるという課題が出されたため

ゴール

Geforce GTX1080を搭載したPCを持っていたため,GPUを使って データセットをtrainして画像のキャプション生成をやってみる. cudaなどの準備に手間が掛かりそうだったのでnvidia-docker というものを使ってみた.

環境

  • Ubuntu16.04.5 LTS

手順

dockerは使える前提

  • nvidia-dockerのインストール

github.com

# If you have nvidia-docker 1.0 installed: we need to remove it and all existing GPU containers
$ docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo apt-get purge -y nvidia-docker

# Add the package repositories
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt update

# Install nvidia-docker2 and reload the Docker daemon configuration
$ sudo apt install -y nvidia-docker2
$ sudo pkill -SIGHUP dockerd

# Test nvidia-smi with the latest official CUDA image
$ docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
  • nvidia-docker でchainer環境にログイン

GitHub - chainer/chainer at v4

$ nvidia-docker run -it chainer/chainer /bin/bash
  • gitインストールとchainerのサンプルプログラム実行(docker内)
# ~ apt update && apt install git
# ~ git clone https://github.com/chainer/chainer
# ~ python chainer/examples/mnist/train_mnist.py --gpu 0
  • 画像キャプション生成サンプルプログラム実行(docker内)

chainer/examples/image_captioning at v4 · chainer/chainer · GitHub

# ~ cd chainer/examples/image_captioning
# ~/chainer/examples/image_captioning# python download.py
# ~/chainer/examples/image_captioning# MPLBACKEND=Agg python train.py --rnn nsteplstm --snapshot-iter 1000 --max-iters 50000 --batch-size 128 --gpu 0
# ~/chainer/examples/image_captioning# python predict.py --img cat.jpg --model result/model_20000 --rnn nsteplstm --max-caption-length 30 --gpu 0

補足

python download.py で MSCOCO のデータセットを落とすときに時間がかかりすぎるときは gsutil rsync を使ってダウンロードした後に,chainer/examples/image_captioning/dataに置く.

http://cocodataset.org/#download