#!

路上に就職!

いまだに現金払い?

両替機で1000円を両替すると以下の硬貨で10円、50円、100円、500円出てきます。
使わない硬貨があっても良いが最大で15枚になるように両替されます。
1000円を入れたときに出てくる両替された硬貨の組み合わせはいくつあるでしょうか?
という問題です。

atcoder.jp

Atcoderのこの問題を思い出しました!
硬貨の最大数も15枚なので全探索で解きました。以下コードです。

count = 0
0.upto(15) do |f|
    0.upto(15) do |h|
        0.upto(15) do |fi|
            0.upto(15) do |t|
                if 15 >= f+h+fi+t
                    ans = (f*500)+(h*100)+(fi*50)+(t*10)
                    if ans == 1000
                        count+=1
                    end
                end 
            end
        end
    end
end

puts count

15枚の制限を読み落とし実装を少し間違えたりしました…😂

10進数で回文

プログラマ脳を鍛える数学パズル」という本を読んでいるのですが
解答をこのブログに載せようと思いました!。

「10進数、2進数、8進数で表現しても回文となる数の中で10進数の10以上で最小の値を求めろ」 という問題です。
ABCのA問題位の難易度ですぐに解けました。

(10..).each do |n|
    if (n.to_s == n.to_s.reverse) && (n.to_s(2) == n.to_s(2).reverse) && (n.to_s(8) == n.to_s(8).reverse)
        puts n
        exit
    end
end

問題的にそこまで時間がかからないだろうと思い10以上の数字すべてが
回文かどうか調べる方法をとりました。
本では2進数に着目し、一番右桁の桁の数字が0になると
左桁も数字も0にならなければいけず2進数としておかしいことから
右の桁が1になる奇数だけに絞って回文となる数を見つけてました。
頭いい!(^o^)

githubのcontribute数をCLIに表示するコマンドを作った。

githubのcontribute数をCLIに表示するコマンドを作成しました。
以下は自分のアカウントの1年のcontribute数です。全然少ない…
f:id:x6d61:20210113171420p:plain gem化してrubygem.orgで公開してます。

rubygems.org また、コードは以下のリポジトリに置いています。 github.com

簡単に説明するとgithubのcontribute数をスクレイピングして色を指定している部分を抜き出しています。

    html = URI(url)
    body = html.read
    body.scan(/<rect.*--color-calendar-graph-day-(bg|L1|L2|L3|L4).*>/)

スクレイピングした結果を各カラーに変更しながら2次元配列に追加しています。

    0.step(commit_data.length - 1, 7) do |index|
      oneweek_tile = commit_data.slice(index, 7)
      oneweek_tile.each_with_index do |item, index|
        @tile_table[index] << TILE_COLOR[item.to_sym]
      end
    end

各カラーに変更する処理はRainbowというgemを使いました。

TILE_COLOR = { bg: Rainbow("[]").color(235, 237, 240).background(235, 237, 240),
                 L1: Rainbow("[]").color(155, 233, 168).background(155, 233, 168),
                 L2: Rainbow("[]").color(111, 197, 100).background(111, 197, 100),
                 L3: Rainbow("[]").color(90, 162, 79).background(90, 162, 79),
                 L4: Rainbow("[]").color(59, 111, 58).background(59, 111, 58),
                 dummy: Rainbow("[]").color(0, 0, 0).background(0, 0, 0) }

CLI部分はThorというgemに頼りました。

 class CLI < Thor
        desc "show user","Shows the number of commits in git"
        option "year",aliases:"y",desc: 'Specify the year to display'
        def show(user)
            git_scrap = GitScrap.new(user)
            git_scrap.year = options["year"].to_i if options["year"]
            git_scrap.make_grass_table()
            git_scrap.tile_table.each { |t| puts t.join }
        end
    end

感想

gemを作ってrubygem.orgに上げる手順がわかってよかったです(^o^)

rubyで鏡餅

ruby鏡餅を表示させてみた。

f:id:x6d61:20210111000030p:plain
実行時
以下はコード

output = []
12.times do |y|
  output[y] = []
  18.times do |x|
    if y == 0 && x >= 10 && x <= 11
      output[y][x] = "\e[32m#\e[0m"
    elsif 1 == y && x >= 10 && x <= 10
      output[y][x] = "\e[32m#\e[0m"
    elsif y == 2 && x >= 9 && x <= 11
      output[y][x] = "\e[33m#\e[0m"
    elsif y == 3 && x >= 8 && x <= 12
      output[y][x] = "\e[33m#\e[0m"
    elsif y == 4 && x >= 9 && x <= 11
      output[y][x] = "\e[33m#\e[0m"
    elsif y == 5 && x >= 6 && x <= 13
      output[y][x] = "#"
    elsif y == 6 && x >= 5 && x <= 14
      output[y][x] = "#"
    elsif y == 7 && x >= 6 && x <= 13
      output[y][x] = "#"
    elsif y == 8 && x >= 4 && x <= 16
      output[y][x] = "#"
    elsif y == 9 && x >= 3 && x <= 17
      output[y][x] = "#"
    elsif y == 10 && x >= 4 && x <= 16
      output[y][x] = "#"
    else
      output[y][x] = " "
    end
  end
end

output.each { |x| puts x.join }

あなたの知らない超絶技巧プログラミングの世界を読んで

今回は以下の本を読んだ、前からこの本には興味があって非常に楽しめた。

www.amazon.co.jp

最初の方の章は著者が作成した作品が紹介されているどれも面白い作品ばかりで

ワクワクするが特に面白かったのは一文字を消しても動くqueneである。

普通のプログラムなら例えばevalのeを消すとSyntax Errorやundefinedなど

エラーが起こるがその作品は一文字消しても動くようになっている。

そのテクニックやアスキーアートにプログラムを埋め込む方法など多彩なテクニックを

紹介している。後半部分は私には結構難しかったがそれでも読むとワクワクした。

ちなみに自分でもアスキーアートFizzBuzzを埋め込むプログラムを書いたので

ぜひ見ていってほしい。

qiita.com

オンライン飲み会を実施してみて

以前同じ会社に勤めていた友人たちと飲もうと思ったのですが
新型コロナウイルスがヤバイのでオンライン飲み会を実施してみました。

※飲み会がお開きになってすぐに書いているので以下の文章は酔って書いています。

最初はZoomを使おうと思っていたのですが
環境は友人に相談したところDiscordがいいと言われたのでDiscordにしました。
Discordを選択した理由としては

  • Skypeだと音声の質が悪い
  • Zoomだと無料版を使うと40分の制限がある
  • ゲームのVCによく利用されるから質がいいはず

当日、Discord素人の僕は友人にグループを作ってもらいボイスチャンネルで開きました。

メリット

  • 集合時間に遅れないしお店を探さなくて済む
  • 閉店や飲み放題とかないので時間を気にしなくて飲める
  • 周りが静かで話しやすい
  • URLや画像をすぐに共有できる

デメリット

  • 終わりが来ないのでいつまでも話してしまう ※切り上げが難しい
  • 料理が貧相 ※当日のつまみはポテチだけ
  • オンラインなのでウェーイみたいな楽しみ方はできない
  • 3人以上になった場合、別々の話をすることができない

感想

いつものメンバーと飲む酒はクソ美味いし最高でした。僕は喫煙者なのですが
タバコが嫌いな人がいないか気にしなくていいので楽です。ただ、美味いつまみは出てこないので
料理を楽しみながら飲みたい人には向かないかもしれません。
あと、飲み放題とか区切りがないので飲む時間をキメて実施したほうがいいかもしれません。
僕はビデオ通話だと緊張するタイプなのですが次回はビデオ通話をしながら飲んでみたいと思います。

早く新型コロナウイルス収まってくれねーかな

おわり

前回作成したキーロガーを少し解析しづらくしてみる。

前回、実験用にキーロガーを書き直したのでそのキーロガーを使用し少し解析しづらくしてみようと思います。

0x6d61.hateblo.jp

実験1 Hyperionを使用する。

Hyperionとは対象のPEファイルを暗号化し実行時に復号し実行する。パッカーらしいです。
下記のリンクからHyperionのコードをダウンロードします。

http://nullsecurity.net/tools/binary.html

インストール

unzip Hyperion-2.2.zip
cd  Hyperion-2.2
sudo apt install i686-w64-mingw32-gcc

zipを解答しmingw-gccをインストールします。
次にMakefileコンパイラの項目を書き換えます。

CC = gcc
↓
CC = i686-w64-mingw32-gcc

makeをするとhyperion.exeが同じディレクトリに出来上がってると思います。
実行方法は暗号化したいファイルと暗号化したファイルを指定するだけです。

hyperion.exe <暗号化したいPEファイル> <暗号化したPEファイル>  

では実際に使用してみます。

Z:\Downloads\Hyperion-2.2>hyperion.exe -v dist\basickeylogger.exe C:\users\user\Desktop\basickeylogger2.exe

 -------------------------------
| Stage 1: Analyzing input file |
 -------------------------------

Opening dist\basickeylogger.exe
Successfully copied file to memory location: 0xb65020
Found valid MZ signature
Found pointer to PE Header: 0x108
Found valid PE signature
Found 64 bit binary
Image base is 0x140000000
Image size is 0x100056000

 -------------------------------
| Stage 2: Generating ASM files |
 -------------------------------

Input file size + Checksum: 0x5648fa
Rounded up to a multiple of key size: 0x564900
INFILE_SIZE equ 0x564900
 written to Src\Container\64\infile_size.inc
Generated checksum: 0x2b0a22ef
Generated Encryption Key:  0x2 0x0 0x1 0x1 0x3 0x3
 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0
Written encrypted input file as FASM array to:
 Src\Container\64\infile_array.inc
IMAGE_BASE equ 0x140000000
 written to Src\Container\64\image_base.inc
IMAGE_SIZE equ 0x56000
 written to Src\Container\64\image_size.inc
REAL_KEY_SIZE equ 0x6
 written to Src\Container\64\key_size.inc
REAL_KEY_RANGE equ 0x4
 written to Src\Container\64\key_size.inc
include 'logfile_disable.asm'
 written to Src\Container\64\logfile_select.asm
include '..\..\Payloads\Aes\64\aes.inc'
 written to Src\Container\64\decryption_payload.asm
include '..\..\Payloads\Aes\64\aes.asm'
 written to Src\Container\64\decryption_payload.asm
include '..\..\Payloads\Aes\64\decryptexecutable.asm'
 written to Src\Container\64\decryption_payload.asm

 --------------------------------
| Stage 3: Generating Executable |
 --------------------------------

Starting FASM with the following parameters:
Commandline: Fasm\FASM.EXE Src\Container\64\main.asm C:\users\user\Desktop\basickeylogger2.exe
FASM Working Directory: Z:\Downloads\Hyperion-2.2
flat assembler  version 1.71.54  (1048576 kilobytes memory)
6 passes, 6.3 seconds, 5676544 bytes.

Done :-)

Z:\Downloads\Hyperion-2.2>

実行して暗号化されたPEファイルを作成したところWindows Defenderに検知されてしまいました。

f:id:x6d61:20200209170409p:plain
Windows Defenderに検知されたところ
少し解析しづらくするはずが検知されてしまったので実験失敗です。次の実験をしてみます。

実験2 PyArmorを使用してPythonコードそのものを難読化する。

前回の実験ではPyinstallerで実行ファイル化したものを暗号化しましたが今回はソースコードそのものを難読化してみたいと思います。
PyArmorのインストールは簡単でpipでパッケージを追加するだけです。
pip install pyarmor
難読化するにはpyarmor o pyファイルとコマンドを実行すれば難読化することができます。

mkdir work
cd work
cp basickeylogger.py .
pyarmor o basickeylogger.py

pyarmorを実行したあとにdistディレクトリが作成されるのでPyinstallerで実行ファイル化すれば難読化を施したキーロガーを作成することができます。

次回はpeCloakを試してみたいと思います。