Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
アセンブリにHello!
Search
trimscash
January 02, 2024
4
34
アセンブリにHello!
大雑把にアセンブリにHello Worldします.
何か間違い等ございましたら,@trims_cashまで
trimscash
January 02, 2024
Tweet
Share
More Decks by trimscash
See All by trimscash
そうだCTFをしよう!(LT会でCTFを開催した
trimscash
0
3
Featured
See All Featured
Building Your Own Lightsaber
phodgson
102
6.1k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.2k
The World Runs on Bad Software
bkeepers
PRO
65
11k
The Cult of Friendly URLs
andyhume
78
6k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Documentation Writing (for coders)
carmenintech
65
4.4k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Embracing the Ebb and Flow
colly
84
4.4k
Fireside Chat
paigeccino
32
3k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
26
2.1k
Building Adaptive Systems
keathley
38
2.2k
Why Our Code Smells
bkeepers
PRO
334
57k
Transcript
アセンブリにHello! trimscash
自己紹介 trimscash 趣味 CTF 幽霊と化してる
なぜアセンブリで遊ぶのか 縛りプレイ的楽しさ! コンピュータの動作がより分かるように! CTFで使える! デバッグができるようになる!
なぜアセンブリで遊ぶのか
なぜアセンブリで遊ぶのか
アセンブリってなんだ?
アセンブリってなんだ. .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" こんなの→ コンピュータがわかる機械語(数値 人間がわかるように したもの!
アセンブリってなんだ. CPUが理解できる指示! 機械語とは.. C言語やら,RustやらPythonやら書い たとて, 最終的に機械語になる!!
アセンブリってなんだ. .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" こんなの→ コンピュータがわかる機械語(数値 人間がわかるように したもの!
アセンブリってなんだ. コンパイルして実行形式のファイルを得る C言語 実行形式ファイル(機械語の集まり
アセンブリってなんだ. 中を見てみると.. 読めん!わからん! 実行形式ファイル(機械語の集まり
アセンブリってなんだ. 実行形式ファイル(機械語の集まり 人間はふつう読めない... じゃあ見やすく 機械語一つ一つに名前を 付けてあげよう! ←これがアセンブリ,だいぶ見やすくなった.
アセンブリを学ぶ まずはHelloWorldしてみよう! 環境: x86_64(macとかでなければOK), Linux (wslでOK) , gcc
.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” # ここに文字列のデータを置く
.intel_syntax noprefix # アセンブラの構文指定 .global main # main をグローバルにする ディレクティブ
コンパイラへ渡す説明文. .data # これより下ではデータを保存していると指定 _helloworld: .asciz “helloworld” # ascizで文字列をここに保存
main: # プログラムが格納されているここのアドレスにmainと命名. mov rax, 1 # write mov rdi,
1 # std 1 ######### 略 ラベル アドレスに名前つけられる. 末尾にコロンをつける. .data _helloworld: # ラベル, このアドレスに文字列が格納 .asciz “helloworld”
レジスタ CPU内部にある小さいメモリ. main: mov rax, 1 mov rdi, 1 lea
rsi, _helloworld mov rdx, 10 syscall mov rax, 60 mov rdi, 0 syscall
レジスタ レジスタ一覧. https://www.jamieweb.net/info/x86_64-general-purpose-registers-reference/
命令 CPUに動作を命令する. このプログラムには3つしかない. mov syscall lea
mov rax, 1 # rax = 1 mov命令 左辺のレジスタorメモリに右辺の値をコピーする. 上例の動作:
rax = 1
lea rsi, _helloworld lea命令 左辺のレジスタorメモリに右辺のアドレス自体 をコピーする. 上例の動作: rsi = _helloworldのさすアドレス
syscall syscall命令 カーネル(OS)の機能(syscall)を呼び出す. raxにsyscallを指定する番号を入れる. その他レジスタに引数を渡す.
syscall命令 raxにsyscallを指定する番号を入れる. Syscall一覧https://filippo.io/linux-syscall-table/
syscall命令 raxにsyscallを指定する番号を入れる. Syscall一覧https://filippo.io/linux-syscall-table/
syscall命令 例:exit(0) Syscall一覧https://filippo.io/linux-syscall-table/
syscall命令 例:exit(0) mov rax, 60 # exitを指定 mov rdi, 0
# 引数に0 (error_code syscall # syscall呼び出し
syscall命令 例:exit(0) mov rax, 60 # exitを指定 mov rdi, 0
# 引数に0 (error_code syscall # syscall呼び出し
アセンブリを書く 知識はそろった!手を動かそう! gcc -c filename.s -o filename.o && ld -e
main -o filename filename.o コンパイル,リンクは↑のコマンドで(linux
.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” # ここに文字列のデータを置く
アセンブリを書く 画面に文字を出力するには? 標準出力に文字をwriteする! writeのsyscallを呼ぼう! Syscall一覧https://filippo.io/linux-syscall-table/
例:write(stdout, “helloworld”, 10) mov rax, 1 # writeを指定 mov rdi,
1 # 標準出力を指定.1は標準出力 lea rsi, _helloworld # 文字列のアドレス mov rdx, 10 # 文字列の長さ(出力するbyte数 syscall # syscall呼び出し
.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” # ここに文字列のデータを置く
アセンブリを動かす 書けた!コンピュータを動かそう! gcc -c filename.s -o filename.o && ld -e
main -o filename filename.o コンパイル,リンクは↑のコマンドで(linux
アセンブリを動かす gcc -c filename.s -o filename.o && ld -e main
-o filename filename.o コンパイル,リンクは↑のコマンドで(linux
アセンブリを動かす 動いた!!!!やったね! 動いた!!!!やったね!
アセンブリ ほかにも知るべきことはたくさんありここでは,伝えきることができない! (スタックとか,リターンアドレスとか,いろんな命令とか,いろいろ)(略). そして僕の説明がわかりにくかったかもしれない! のでリンクを張る. - 人間コンパイラコンテストのチュートリアル 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
最後に ほかにも知るべきことはたくさんありここでは, 伝えきることができない! 自分で調べて,学び,手を動かすことが大切! 授業だけではもったいない... 結局...
最後に みんなアセンブラを書こう!
そして みんなCTFをやろう!
アセンブリにHello! trimscash