aが1ならTRUE、0ならFALSEと表示するプログラムですが、aの値は1から変更していないので、必ずTRUEの分岐しかしません。TRUEが表示されました。何度やっても、TRUEしか表示しません。aの値を変更する方法で、FALSEへ分岐してみます。560が、printf(puts)のようですね。それぞれに渡す文字列をその前の行、アドレス6c5と、6d3で設定しています。変数aに1を入れている箇所は、アドレス6b8の行にありました。$0x1,-0x4(%rbp)4番目のデータの01を00にすれば、FALSEの方にしか分岐しなくなります。4なので、6bbです。0x6bb'1723a.outの1723の位置を0に書き換えます。はい、FALSEと表示されました。何回実行しても、FALSEです。変数aの値を0にして分岐を変更することはできました。次は、分岐処理そのものを改造します。再度ビルドして、a.outを元に戻します。t.c実行すると、TRUEに戻ってますね。先ほどのアセンブラの、6c3の行に着目します。<puts@plt>jeは、一致したら指定されたアドレスへジャンプする命令です。6d3とあるので、一致したら6d3のアドレス、つまりFALSE側の処理へジャンプします。このje命令を、逆の命令jneに書き換えます。Equal)どこからjne命令が出てきたのか、思いついたのかというと、感です。プログラマーは、プログラムを知らなくても、今持ってる情報の中から、法則を見つけてプログラムできるんです。当たりをつけたjneで命令が存在するか検索してみましょう。<__libc_csu_init+0x40>takk@deb9:~/tmp$3つほどヒットしました。3つに共通するデータは75ですので、おそらくこの75が、jneの意味でしょう。ちなみに、他のどんなジャンプ命令があるか気になります。jから始まる命令を検索してみます。<__libc_csu_init+0x40>takk@deb9:~/tmp$今回検索したa.outではje、jmp、jne、jmpq、jbeって命令が見つかりました。実際はもっとたくさんあると思います。jeをjneに変更します。<main+0x23>6c3を10進変換。74が入ってた位置に75を上書きします。kB/stakk@deb9:~/tmp$置換後のアセンブラ確認。je命令があったアドレス6c3は、見事にjneに置換されました。<main+0x23>では実行。パンを見てるだけで幸せな気分になります。タイトルの件、やってみます。HELLOと表示するプログラム。