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
35
アセンブリに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
A Modern Web Designer's Workflow
chriscoyier
693
190k
Statistics for Hackers
jakevdp
796
220k
Scaling GitHub
holman
458
140k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.5k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
Being A Developer After 40
akosma
86
590k
Code Reviewing Like a Champion
maltzj
520
39k
Art, The Web, and Tiny UX
lynnandtonic
297
20k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
0
89
Speed Design
sergeychernyshev
25
620
Music & Morning Musume
bryan
46
6.2k
Bash Introduction
62gerente
608
210k
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