ちょまどネイティブプログラム入門

main(int型変数)
27
ちょまど@ ITエンジニア @chomado

dataセクションぶっ壊すとどうなるんだろう?

2015-03-25 09:36:07
ちょまど@ ITエンジニア @chomado

私もやってみたいのですが、どうやったらdataセクションぶっ壊せるのですか?ヽ(;▽;)ノ C言語で、グローバルで宣言した変数(明示的には初期化しない=0初期化される)のアドレスに、何かを上書きするとかですか?ヽ(;▽;)ノでもこれ普通に代入してるだけですよね全然わからないです

2015-03-25 09:40:24
ちょまど@ ITエンジニア @chomado

やばいまず「オフセット」が分かってない…予想ではこれは相対的なアドレスかなあ…調べる!

2015-03-25 09:44:13
ちょまど@ ITエンジニア @chomado

@chomado > 計算機工学と低レベルのプログラミング(例えばアセンブリ言語)において、通常オフセットは特定の絶対アドレスを示すために、ベースアドレスに加えられるアドレスの数を意味する。この用法では、オフセットは相対アドレスと言い換えることがある。 なるほど!

2015-03-25 09:45:36
koba @tetsu_koba

ちょまどネイティブコードプログラミング入門をTogatterにまとめてほしい。

2015-03-25 10:13:53
とみながたけひろ @takehiro_t

手元のオレオレ環境、int main;したら「データセグメントにテクストセグメントから飛ぶなんて、リロケーションできるかボケ」という警告が出た。そういえばそういうエラーチェックを仮で書いてたのだけどちゃんと動くかテストしてなかったわー(もちろんコミットもしてない)

2015-03-25 10:49:57
NaOHaq(苛性ソーダ) @NaOHaq

@chomado 実際には、コンパイルとかリンクで生成されたオブジェクトファイルの中にそういう構造がある。詳しくは Linkers and Loaders amazon.co.jp/dp/4274064379 を読むべし。

2015-03-25 11:07:05
ちょまど@ ITエンジニア @chomado

会社着いたので, れいの main; をステップ実行してみました!! でもよくわからないなあ><これってつまり何が起こってるの pic.twitter.com/Uhno5JJP8y

2015-03-25 11:23:56
拡大
ちょまど@ ITエンジニア @chomado

"RIP" ってなんだろう…? 「rest in peace」?

2015-03-25 11:26:44
Takanori Watanabe 💉💉💉💉💉 @takawata19

@kosaki55tea @chomado X86/X64の命令ポインタの三段階目の進化 (ip→eip→rip)

2015-03-25 11:33:11
ちょまど@ ITエンジニア @chomado

@chomado Rest in peace (安らかに眠れ) な訳がないので、多分 Run Instructions by steP とかだと予想!!!

2015-03-25 11:33:15
NaOHaq(苛性ソーダ) @NaOHaq

@chomado Instruction Pointer が入っているレジスタの名前。 8086(16bit)では IP 80386(32bit)では EIP x86-64(64bit)では RIP という名前になっている

2015-03-25 11:35:16
ちょまど@ ITエンジニア @chomado

こんなんわかりませんよ!! >rt

2015-03-25 11:36:49
ちょまど@ ITエンジニア @chomado

なるほど…レジスタの名前覚えるぞ!₍₍⁽⁽(ી(*゚▽゚*)ʃ)₎₎⁾⁾ノリノリ!

2015-03-25 11:38:11
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

@takawata19 @chomado SEGVするとRIPが死んだ場所を指してるから正しく Rest In Place で素晴らしいネーミングセンスだと感動したものである

2015-03-25 11:39:03
とみながたけひろ @takehiro_t

よくはまるARMのスライドに「ipレジスタはインタープロシジャーの略。インストラクションポインタではない」って追記しておくの忘れてるな

2015-03-25 11:42:28
Takanori Watanabe 💉💉💉💉💉 @takawata19

const int main = 0xc3;(.rodataと.textはおなじセグメント属性と、リンカスクリプトに書いてあった) /* Read-only sections, merged into text segment: */

2015-03-25 11:49:13
NaOHaq(苛性ソーダ) @NaOHaq

@chomado この 0x100001000: addb %al, (%rax) って 0x0000 をx86-64で逆アセンブルした結果だと思う。 だからひたすら0が並んでる場所を実行しようとしてる。

2015-03-25 11:59:46
ちょまど@ ITエンジニア @chomado

なるほど, ADDB命令 って ADD命令のことらしい (調べてる

2015-03-25 12:11:30
NaOHaq(苛性ソーダ) @NaOHaq

@chomado c-jump.com/CIS77/CPU/x86/… を見ると、 1バイト目が 0x00 だとニーモニックはADD、演算単位は8bitで、 メモリ ← メモリ + レジスタ という操作をする命令になる。

2015-03-25 12:17:15
ちょまど@ ITエンジニア @chomado

なるほど, x86 では 0x00 は ADD 命令に鳴るんだ

2015-03-25 12:18:41
NaOHaq(苛性ソーダ) @NaOHaq

@chomado 逆アセ結果の "%al" というのは「ALレジスタ」 "(%rax)" というのは「RAXレジスタに入ったアドレスが指すメモリ上の場所」→Cでいうと *((char *)rax) みたいな意味

2015-03-25 12:21:47
ちょまど@ ITエンジニア @chomado

@NaOHaq !!! な, なるほどです! すごく分かりやすいです!! ありがとうございます!ヽ(;▽;)ノ では addb %al, (%rax) は, RAXレジスタに入ったアドレスが指すメモリ上の場所の値を 足したものをALレジスタに格納, ということですか?><

2015-03-25 12:24:36
NaOHaq(苛性ソーダ) @NaOHaq

@chomado だから、 addb %al, (%rax) をC風に書くと uint8_t al; uint64_t rax; *((uint8_t *)rax) += al; みたいな意味。 で、raxが指してるメモリのアドレスが無茶苦茶なのでアクセス違反になってる。

2015-03-25 12:25:28