0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

paizaでアセンブラ その17

Posted at

概要

paizaでアセンブラ、やってみた。
アセンブラ、見つけたので、やってみた。
直打ちする根性は無いので、pythonでやってみた。

参考にしたページ

サンプルコード

# -*- coding: utf-8 -*-

import re
import subprocess
import os

src = """

#ヘッダ(64 バイト)

7f 45 4c 46			 | マジックナンバー
02					  | 64 ビット
01					  | リトルエンディアン
01					  | バージョン(実質 1 で固定)
00					  | UNIX System V ABI
00					  | ABI のバージョン(実質 0 で固定)
00 00 00 00 00 00 00	| 予約領域(0 で埋める)
02 00				   | 実行ファイル
3e 00				   | x86-64
01 00 00 00			 | バージョン(実質 1 で固定)
b0 00 40 00 00 00 00 00 | エントリポイントは 0x4000b0
40 00 00 00 00 00 00 00 | プログラムヘッダテーブルまで 64 バイト
ee 00 00 00 00 00 00 00 | セクションヘッダテーブルまで 238 バイト
00 00 00 00			 | プロセッサ固有のフラグ(たぶん 0 で OK)
40 00				   | このヘッダは 64 バイト
38 00				   | プログラムヘッダテーブルのエントリは一つ当たり 56 バイト
02 00				   | プログラムヘッダテーブルのエントリは二つ
40 00				   | セクションヘッダテーブルのエントリは一つ当たり 64 バイト
04 00				   | セクションヘッダテーブルのエントリは四つ
03 00				   | セクションヘッダテーブルのエントリ 3 がセクションヘッダ文字列テーブルの情報を格納している

#プログラムヘッダテーブル(56 バイト × 2)

#エントリ 1(56 バイト)

01 00 00 00			 | ロード可能セグメント
05 00 00 00			 | 実行可能、読み取り可能
b0 00 00 00 00 00 00 00 | ファイル先頭から 176 バイト
b0 00 40 00 00 00 00 00 | 仮想アドレスは 0x4000b0
00 00 00 00 00 00 00 00 | 物理アドレス(0 でいいはず)
18 00 00 00 00 00 00 00 | セグメントは 24 バイト
18 00 00 00 00 00 00 00 | ロードされるときも 24 バイト
01 00 00 00 00 00 00 00 | アライメントの必要なし

#エントリ 2(56 バイト)

01 00 00 00			 | ロード可能セグメント
04 00 00 00			 | 読み取り可能
c8 00 00 00 00 00 00 00 | ファイル先頭から 200 バイト
c8 10 40 00 00 00 00 00 | 仮想アドレスは 0x4010c8
00 00 00 00 00 00 00 00 | 物理アドレス(0 でいいはず)
0d 00 00 00 00 00 00 00 | セグメントは 13 バイト
0d 00 00 00 00 00 00 00 | ロードされるときも 13 バイト
00 10 00 00 00 00 00 00 | ページサイズ(4096 バイト)でアライメントする

#セグメント 1(24 バイト)

#.text セクション(24 バイト)

b0 01				   | mov	$0x1,%al
40 b7 01				| mov	$0x1,%dil
48 8d 34 25 c8 10 40	| lea	0x4010c8,%rsi
00
b2 0d				   | mov	$0xd,%dl
0f 05				   | syscall
b0 3c				   | mov	$0x3c,%al
40 b7 00				| mov	$0x0,%dil
0f 05				   | syscall

#セグメント 2(13 バイト)

#.rodata セクション(13 バイト)

68 65 6c 6c 6f 2c 20 77 6f 72 6c 64 0a | "hello, world\n"

#セクションヘッダ文字列テーブル(25 バイト)

00							| "\0"
2e 74 65 78 74 00			 | ".text\0"
2e 72 6f 64 61 74 61 00	   | ".rodata\0"
2e 73 68 73 74 72 74 61 62 00 | ".shstrtab\0"

#セクションヘッダテーブル(64 バイト × 4)

#エントリ 0(64 バイト)

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

#エントリ 1(64 バイト)

01 00 00 00			 | セクションヘッダ文字列テーブルの 1 バイト目からが名前
01 00 00 00			 | プログラム定義の内容を含む
06 00 00 00 00 00 00 00 | ロードされ、実行可能
b0 00 40 00 00 00 00 00 | 仮想アドレスは 0x4000b0
b0 00 00 00 00 00 00 00 | ファイル先頭から 176 バイト
18 00 00 00 00 00 00 00 | セクションは 24 バイト
00 00 00 00			 | 他のセクションとは特に関係なし
00 00 00 00			 | 追加情報なし
01 00 00 00 00 00 00 00 | アライメントなし
00 00 00 00 00 00 00 00 | 固定長エントリを含まない

#エントリ 2(64 バイト)

07 00 00 00			 | セクションヘッダ文字列テーブルの 7 バイト目からが名前
01 00 00 00			 | プログラム定義の内容を含む
02 00 00 00 00 00 00 00 | ロードされる
c8 10 40 00 00 00 00 00 | 仮想アドレスは 0x4010c8
c8 00 00 00 00 00 00 00 | ファイル先頭から 200 バイト
0d 00 00 00 00 00 00 00 | セクションは 13 バイト
00 00 00 00			 | 他のセクションとは特に関係なし
00 00 00 00			 | 追加情報なし
01 00 00 00 00 00 00 00 | アライメントなし
00 00 00 00 00 00 00 00 | 固定長エントリを含まない

#エントリ 3(64 バイト)

0f 00 00 00			 | セクションヘッダ文字列テーブルの 15 バイト目からが名前
03 00 00 00			 | 文字列テーブルを含む
00 00 00 00 00 00 00 00 | ロードされない
00 00 00 00 00 00 00 00 | 仮想アドレスなし
d5 00 00 00 00 00 00 00 | ファイル先頭から 213 バイト
19 00 00 00 00 00 00 00 | セクションは 25 バイト
00 00 00 00			 | 他のセクションとは特に関係なし
00 00 00 00			 | 追加情報なし
01 00 00 00 00 00 00 00 | アライメントなし
00 00 00 00 00 00 00 00 | 固定長エントリを含まない


"""
lines = src.split('\n')
#print(len(lines))
with open('a.out', 'wb') as f:
    for line in lines:
        line = re.sub(r"#.+", "", line)
        line = re.sub(r"\|.+", "", line)
        line = line.strip()
        if len(line) > 1:
            if len(line) == 2:
                #print(int(line, 16))
                f.write(chr(int(line, 16)))
            else:
                items = line.split(' ')
                for item in items:
                    #print(int(item, 16))
                    f.write(chr(int(item, 16)))
                    
os.system("chmod 755 a.out")                    
#os.system("ls -la")                    
os.system("./a.out")




                    

実行結果

hello, world

成果物

以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?