Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
アセンブリにHello!
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
trimscash
January 02, 2024
85
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
アセンブリにHello!
大雑把にアセンブリにHello Worldします.
何か間違い等ございましたら,@trims_cashまで
trimscash
January 02, 2024
More Decks by trimscash
See All by trimscash
そうだCTFをしよう!(LT会でCTFを開催した
trimscash
0
35
Featured
See All Featured
Six Lessons from altMBA
skipperchong
29
4.6k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Faster Mobile Websites
deanohume
310
32k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
4
4.4k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
Agile that works and the tools we love
rasmusluckow
331
22k
GraphQLとの向き合い方2022年版
quramy
50
15k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.2k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.4k
Chasing Engaging Ingredients in Design
codingconduct
0
380
Utilizing Notion as your number one productivity tool
mfonobong
4
630
A Modern Web Designer's Workflow
chriscoyier
699
190k
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