sysprog2017
dev_record
contributed by <HMKRL
, HTYISABUG
>
目前手機行動支付的運作模式分為 HCE (Host Card Emulation) 和 TSM (Trusted Service Manager) 前者為 Android Pay 採用的方式,後者則需要硬體安全元件 (SE, Secure Element)作為 TEE ,包括 SWP-SIM 卡或特殊的 SDCard ,Apple Pay 則採用內建的獨立硬體作為安全元件。
使用者的付款資料儲存在安全元件中,需要時直接由 NFC Controller存取,不透過其他應用程式或裝置本身的 CPU
Samsung手機內建的 KNOX 功能也為每支手機提供了獨立的硬體 key, 由 bootloader 開始確認裝置安全性,若偵測到裝置韌體被修改過就會觸發處理器中的 e-fuse 保護使用者的資料安全
Name | Description |
---|---|
fp | the frame pointer |
sp | the stack pointer |
r0~r13 | general purpose registers |
gsr
ssr
Special Register | Description |
---|---|
0 | status register with the following bit values |
1 | ptr to Exception Handler routine |
2 | upon invocation of Exception Handler, will have one of four values |
3 | the swi request number |
4 | addr. of the supervisor mode stack on which exceptions aree executed |
5 | retuen addr. upon entering the Exception Handler |
6 | reserved |
7 | reserved |
8 | reserved |
9 | an optional non-zero ptr to the Device Tree blob describing this device |
Instruction 長度皆為 16 bits, 有些會有 32 bits 長的常數作為後綴
指令太多了就不一一列出, 要用時直接去網站上查詢比較快
mmap
系統呼叫輸入的主程式碼如下
static bool loadRawData(machine &mach, const string &filename)
{
// open and mmap input file
mfile pf(filename);
if (!pf.open(O_RDONLY))
return false;
static unsigned int dataCount = 0;
char tmpstr[32];
// alloc new data memory range
sprintf(tmpstr, "data%u", dataCount++);
size_t sz = pf.st.st_size;
addressRange *rdr = new addressRange(tmpstr, sz);
// copy mmap'd data into local buffer
rdr->buf.assign((char *) pf.data, sz);
rdr->updateRoot();
// add to global memory map
return mach.mapInsert(rdr);
}
在這裡會將文件中的資料複製到記憶體中
被複製儲存的資料能經由 moxie_memmap
全域變數取得
這是一個 struct 指標, struct 結構如下
struct moxie_memory_map_ent {
void *addr;
size_t length;
char tags[32 - 4 - 4];
};
addr
指向資料實際儲存的位址
length
為資料長度, 單位 byte
tags
用來標示資料
在用 src/sandbox
執行程式時輸出的文字就是跟資料有關
ep 00001000
ro 00000f8c-0000146c elf0 // tag elf0
rw 0000156c-000019d8 elf1 // tag elf1
rw 000029d8-000129d8 stack // tag stack
ro 000139d8-00013a78 mapdesc // tag mapdesc
輸出的主程式碼如下
src/sandbox.cc
// static void gatherOutput(machine &mach, const string &outFilename)
uint32_t vaddr = mach.cpu.asregs.sregs[6];
uint32_t length = mach.cpu.asregs.sregs[7];
if (!vaddr || !length)
return;
char *p = (char *) mach.physaddr(vaddr, length);
會從 $sr6
$sr7
取出記憶體位置與長度
再經由 physaddr
轉換為實體記憶體位置, 最後輸出為文件
輸出似乎不是單純把資料換為 ASCII 輸出
BOLOS 是利用 MOXIE VM
只能在封閉環境執行, 不能直接 I/O 的特性來運轉的
包括 private key , 生成 address 跟認証交易都會在 VM 中進行
外部環境能取得的只有被 API 限制的資訊, 且也無法對內部進行規範外操作
cross compiler 能在平台上編譯不同架構處理器能運作的程式碼(例如在 x86 架構的主機上編譯 arm 執行檔,或是像 sandbox 作業一樣編譯出 moxie 執行檔)
應用情境:
ELF 執行檔包含 .text
/.init
/.data
等 section, 可以透過 readelf -a <filename>
檢視 ELF 檔細節
.text
和 .data
section 內容呢?參照 開發紀錄
step
是如何透過 GDB stub 傳遞到 moxiebox 裡頭呢?兩邊的通訊協定又為何?
src/sandbox.cc
檔案內容和 GDB Remote Serial Protocol參照 開發紀錄
cbmc可以用於檢查C/C++程式中的 Boundary checking: 例如指標存取是否合法/陣列存取是否超出範圍等等,可以用於預防可能出現的邏輯錯誤或程式編輯器檢查功能等
透過不同的狀態 (state) 和事件 (event) 進行運作,可以進行各種計算
常見的例如 compiler/text processing 等領域