Get Time
1 2 3 4 5 6 7 8
| float getTime() { register unsigned long f, t; asm volatile("mrs %0, cntfrq_el0" : "=r"(f)); asm volatile("mrs %0, cntpct_el0" : "=r"(t)); return (float)t / f; }
|
Reboot
經測試,可於 QEMU 6.1 raspb3 運作
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #define PM_PASSWORD 0x5a000000 #define PM_RSTC ((volatile unsigned int *)(0x3F10001c)) #define PM_WDOG ((volatile unsigned int *)(0x3F100024))
void reset(int tick) { *PM_RSTC = PM_PASSWORD | 0x20; *PM_WDOG = PM_PASSWORD | tick; }
void cancel_reset() { *PM_RSTC = PM_PASSWORD | 0; *PM_WDOG = PM_PASSWORD | 0; }
|
Testing script
套用在pwntools ,一開始擔心不停頓一直傳送指令會有問題,但rpi3的FIFO深度(4096)顯然是足夠的。serialtube很多餘的將換行符號轉換,必須停用convert_newlines。
1 2
| if self.convert_newlines: data = data.replace(b'\n', b'\r\n')
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| from pwn import * import sys
try: filename = sys.argv[1] port = sys.argv[2] except(IndexError): exit(1)
try: with open(filename) as f: io = serialtube(port, baudrate=115200, convert_newlines=False) for line in f: io.send(str.encode(line))
except(FileNotFoundError): print("File Not Found!") exit(1)
|