Upgrade to Pro — share decks privately, control downloads, hide ads and more …

アセンブリにHello!

trimscash
January 02, 2024
30

 アセンブリにHello!

大雑把にアセンブリにHello Worldします.

何か間違い等ございましたら,@trims_cashまで

trimscash

January 02, 2024
Tweet

Transcript

  1. アセンブリってなんだ. .intel_syntax noprefix .global main main: mov rax, 1 #

    write mov rdi, 1 # std 1 lea rsi, _helloworld # string address mov rdx, 10 # length syscall mov rax, 60 # exit mov rdi, 0 syscall .data _helloworld: .asciz "helloworld" こんなの→ コンピュータがわかる機械語(数値 人間がわかるように したもの!
  2. アセンブリってなんだ. .intel_syntax noprefix .global main main: mov rax, 1 #

    write mov rdi, 1 # std 1 lea rsi, _helloworld # string address mov rdx, 10 # length syscall mov rax, 60 # exit mov rdi, 0 syscall .data _helloworld: .asciz "helloworld" こんなの→ コンピュータがわかる機械語(数値 人間がわかるように したもの!
  3. .intel_syntax noprefix .global main main: mov rax, 1 # writeを指定

    mov rdi, 1 # std 1 標準出力 lea rsi, _helloworld # string address 文字列のアドレス mov rdx, 10 # length syscall # syscall呼び出し mov rax, 60 # exitを指定 mov rdi, 0 # 引数に0 (error_code syscall # syscall呼び出し .data _helloworld: # 文字列が置かれているアドレスに名前を付けた. .asciz “helloworld” # ここに文字列のデータを置く
  4. .intel_syntax noprefix # アセンブラの構文指定 .global main # main をグローバルにする ディレクティブ

    コンパイラへ渡す説明文. .data # これより下ではデータを保存していると指定 _helloworld: .asciz “helloworld” # ascizで文字列をここに保存
  5. main: # プログラムが格納されているここのアドレスにmainと命名. mov rax, 1 # write mov rdi,

    1 # std 1 ######### 略 ラベル アドレスに名前つけられる. 末尾にコロンをつける. .data _helloworld: # ラベル, このアドレスに文字列が格納 .asciz “helloworld”
  6. レジスタ CPU内部にある小さいメモリ. main: mov rax, 1 mov rdi, 1 lea

    rsi, _helloworld mov rdx, 10 syscall mov rax, 60 mov rdi, 0 syscall
  7. syscall命令 例:exit(0) mov rax, 60 # exitを指定 mov rdi, 0

    # 引数に0 (error_code syscall # syscall呼び出し
  8. syscall命令 例:exit(0) mov rax, 60 # exitを指定 mov rdi, 0

    # 引数に0 (error_code syscall # syscall呼び出し
  9. アセンブリを書く 知識はそろった!手を動かそう! gcc -c filename.s -o filename.o && ld -e

    main -o filename filename.o コンパイル,リンクは↑のコマンドで(linux
  10. .intel_syntax noprefix .global main main: mov rax, 1 # writeを指定

    mov rdi, 1 # std 1 標準出力 lea rsi, _helloworld # string address 文字列のアドレス mov rdx, 10 # length syscall # syscall呼び出し mov rax, 60 # exitを指定 mov rdi, 0 # 引数に0 (error_code syscall # syscall呼び出し .data _helloworld: # 文字列が置かれているアドレスに名前を付けた. .asciz “helloworld” # ここに文字列のデータを置く
  11. 例:write(stdout, “helloworld”, 10) mov rax, 1 # writeを指定 mov rdi,

    1 # 標準出力を指定.1は標準出力 lea rsi, _helloworld # 文字列のアドレス mov rdx, 10 # 文字列の長さ(出力するbyte数 syscall # syscall呼び出し
  12. .intel_syntax noprefix .global main main: mov rax, 1 # writeを指定

    mov rdi, 1 # std 1 標準出力 lea rsi, _helloworld # string address 文字列のアドレス mov rdx, 10 # length syscall # syscall呼び出し mov rax, 60 # exitを指定 mov rdi, 0 # 引数に0 (error_code syscall # syscall呼び出し .data _helloworld: # 文字列が置かれているアドレスに名前を付けた. .asciz “helloworld” # ここに文字列のデータを置く
  13. アセンブリを動かす 書けた!コンピュータを動かそう! gcc -c filename.s -o filename.o && ld -e

    main -o filename filename.o コンパイル,リンクは↑のコマンドで(linux
  14. アセンブリを動かす gcc -c filename.s -o filename.o && ld -e main

    -o filename filename.o コンパイル,リンクは↑のコマンドで(linux
  15. アセンブリ ほかにも知るべきことはたくさんありここでは,伝えきることができない! (スタックとか,リターンアドレスとか,いろんな命令とか,いろいろ)(略). そして僕の説明がわかりにくかったかもしれない! のでリンクを張る. - 人間コンパイラコンテストのチュートリアル https://github.com/Alignof/HCCC_Tutorial/tree/master - x86のやつだけどわかりやすいやつ

    https://doomo.main.jp/x86asm/ - レジスタ一覧 https://www.jamieweb.net/info/x86_64-general-purpose-registers-reference/ - syscall一覧 https://filippo.io/linux-syscall-table - (CTF)pwn入門(僕が書いたやつ.スタックとか説明してるよあとCTFやれ https://qiita.com/trimscash/items/71f417f99508f8ca78f8