# 12/3 低レイヤ勉強会 ## 今月の報告会について - 今月は低レイヤが発表と技術的トピックスを発表します(先月が高レイヤだったので) - 発表者は1年生から出したいと思います - 技術的トピックスの内容は小俣が準備します - 発表内容・方法については2-3年生の先輩方にぜひ相談してください ## 来年度の低レイヤの活動について - 来年度低レイヤとして何をやりたいか現1年生中心に今から考えておいてほしいです - 2年生はすでにやらせてもらっているので(OS)、1年生の案を重視します - ただ2年生もまだ現役なのでプロジェクトに協力できます - 候補 - マルウェア解析(水澤) - アナライジング・マルウェア - 案の例 - CTFの延長 - バグバウンティ - 毎月いろんなCTFへの積極的参加&戦績公開 - https://ctftime.org/event/list/upcoming - モノづくり系 - Linuxカーネルからオリジナルのディストリビューションを作る - ディストリビューション:Ubuntu, KALI,... - Linuxカーネルに肉付けしてOSにする - OS(引継ぎ) - OS自作入門 を参考にやってます ## 今月の勉強会の進め方 - 今月はPythonスクリプトの書き方と、先月で詰まったところを解説します - 「ASLRの回避」当たりで詰まったので、「セキュリティコンテストチャレンジブック」を参考に改めて説明しようと思います - Pythonスクリプトについて、今まで pwntoolsを使っていましたが、処理がブラックボックスになっているところが結構あるので、なるべく標準機能を使うようにしていきます - 以下のコードをベースに使っていきます。 - 処理に関しては、基本問題サーバーにつなぐと"Please insert your ID and Password ..."など文字列の入力が促されるところからはじまるので、scanfやgetsで確保される分の変数領域を適当な文字で埋めて、その次に関数のメモリアドレスを書き、読み込ませて実行させる「スタックオーバーフロー」が基本です ```a.py import socket import time import os import struct import telnetlib # connect はサーバーに接続するための関数。 def connect(ip, port): return socket.create_connnection((ip.port)) # p(x)とu(x)は4バイト数字データを文字列に変換。 # 例: \x78\x56\x34\x12 とかくところを p(0x12345678)と書けるようになる。 def p(x): return struct.pack('<I',x) def u(x): return struct.unpack('<I',x)[0] def interact(s): print('--------- interactive mode ----------') t = telnetlib.Telnet() t.sock = s t.interact() s = connect('127.0.0.1', 4000) # CTFの問題サーバーのアドレスとポート # ここに処理をいろいろ書いていきます interact(s) # s = connect でサーバーにつないでコードを送った後、直接操作できるようにする。 ``` - 問題のソースコードはこれです 各自コンパイルしておいて下さい ```a.c #include <stdio.h> #include <string.h> int main(int argc, char *argv[]){ char msg[]="Hello\n"; char buf[32]; write(1,msg,strlen(msg)); read(0,buf,128); return 0; } ```