Lab1: Get Time & Reboot

Get Time

1
2
3
4
5
6
7
8
float getTime() {
register unsigned long f, t;
// Get the current counter frequency
asm volatile("mrs %0, cntfrq_el0" : "=r"(f));
// Read the current counter
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) {
// reboot after watchdog timer expire
*PM_RSTC = PM_PASSWORD | 0x20; // full reset
*PM_WDOG = PM_PASSWORD | tick; // number of watchdog tick
}

void cancel_reset() {
*PM_RSTC = PM_PASSWORD | 0; // full reset
*PM_WDOG = PM_PASSWORD | 0; // number of watchdog tick
}

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)