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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
trimscash
January 02, 2024
4
64
アセンブリにHello!
大雑把にアセンブリにHello Worldします.
何か間違い等ございましたら,@trims_cashまで
trimscash
January 02, 2024
Tweet
Share
More Decks by trimscash
See All by trimscash
そうだCTFをしよう!(LT会でCTFを開催した
trimscash
0
18
Featured
See All Featured
Practical Orchestrator
shlominoach
191
11k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
610
Docker and Python
trallard
47
3.7k
Building an army of robots
kneath
306
46k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
59
50k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.1k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
220
4 Signs Your Business is Dying
shpigford
187
22k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Optimising Largest Contentful Paint
csswizardry
37
3.6k
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