コンピュータについて学ぶブログ

コンピュータ関連以外のことも書きます

アセンブリでの関数呼び出しの備忘録

CTFのPwnについて勉強している時に、関数呼び出時の処理をよく忘れてしまうので一度まとめてみます。

関数呼び出しの手順

関数を呼び出すときは以下の処理が行われます

  1. 呼び出し元のアドレスを保存し、関数のアドレスへ移動(call)
  2. 関数の処理
  3. スタック上のアドレスの開放(leave)
  4. 呼び出し元へ帰る(ret)
続きを読む

Linux入門 #1 Linuxとは何か?

今回は、Linuxとはどういうものなのかということを大雑把に紹介したいと思います。

Linuxとは

Linuxという言葉は、狭義にはLinuxカーネルというLinuxの中核部分のことを指し、広義にはLinuxカーネルを用いたOSのことを指します。

Linuxは1991年にリーナス・トーバルズ氏によって開発され、そこから現在に至るまで発展してきました。

Linuxのホームページによると、Linuxスマートフォンから車、スーパーコンピューター、家電製品、家庭用PC、企業のサービスなどあらゆる場所で使われているOSだそうです。 身近な例でいうと、スマートフォンのOSのAndroidLinuxをベースにしたOSです。

Linuxの大きな特徴はオープンソースである点です。Linuxカーネルソースコードが公開されています。これが、WindowsMacOSなどといったOSとの大きな違いです。 また、無料で使うことができるのですぐに仮想環境やパソコンにインストールして簡単に使い始めたりすることができます。

続きを読む

実行ファイルのセキュリティ機構についてまとめてみる

CTFのpwnについて調べているとよくセキュリティ機構の用語が出てきます。しかし、それぞれのセキュリティ機構がどんな役割を果たすのかをよく忘れてしまいます。なので、一度まとめてみました。

実行ファイルのセキュリティ機構について、こちらの書籍を参考にしました。

続きを読む

MacOS用のシェルコード を書いてみた

一度シェルコード を書いてみたいと前から思っていたので、今回書いてみようと思います。

Linux用のシェルコードはこれまでに何度か見たことがあり、MacOS用に書くならどう書くのだろうと気になったので、今回はMacOS用のシェルコードを書いてみます。

実行環境

  • macOS Catalina v10.15
  • nasm 2.14.02
  • gcc 4.2.1

アセンブリコードの作成

まずは、シェルを起動するアセンブリを書きます。プログラムの実行はexecveを使うことで行えるので、これを使ってシェルを起動します。

; shellcode.asm

  global _main
  global start
  section .text

start:
  ; execve("/bin//sh", {"/bin//sh", NULL}, NULL)
  ; => rax: 0x200003B
  ;    rdi: "/bin//sh\0"
  ;    rsi: {"/bin//sh\0", 0}
  ;    rdx: NULL
  xor rdx, rdx                ; clear rdx
  push rdx
  mov rax, 0x68732f2f6e69622f ; /bin//sh
  push rax
  mov rdi, rsp                ; rdi = "/bin//sh\0"
  push rdx
  push rdi
  mov rsi, rsp                ; rsi = {"/bin//sh\0", NULL}
  mov rax, 0x1ffffff          ; rax = 0x200003b - 0x3c = 0x1ffffff
  add rax, 0x3c               ; rax = 0x200003b
  syscall
続きを読む