<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      [openssl] openssl asynch_mode 使用libasan時的OOM問題

       

       [classic_tong: http://www.rzrgm.cn/hugetong/p/14231782.html]

      概述

      openssl支持async mode.  在定位越界問題時,我使用了libasan, 之后就OOM了, 能夠看見在這個地方:

       

       

       

      原因是因為,  memset的size參數特別大, (程序本身的虛擬內存就占了很多, 隨著memset的寫入,會不斷申請更多的真實內存,最后OOM ?? )

      接下來將重點分析為什么size會這么大

       

      使用

      openssl 使用libasan的方法

      config時,使用選項 enable-asan

      ./Configure --prefix=/root/debug/ shared 
              enable-asan \
              LDFLAGS="-Wl,-rpath,/root/debug/lib" \
              linux-x86_64

       

      用戶程序使用libasan的方法:

      因為我的程序是用來了openssl, 所以兩邊都要同時加, 實踐過程中, 如果用戶程序不加只在openssl上加是不行的.

      LDFLAGS也要叫兩個-f參數, 不然會coredump, 我也不知道為什么.

      CFLAGS+=-fsanitize=address -fno-omit-frame-pointer
      LDFLAGS+= -lssl -lcrypto
      LDFLAGS+=-fsanitize=address -fno-omit-frame-pointer
      LDFLAGS+= -lasan

       

       

      分析

      一  libasan

      libasan怎么檢測longjmp API,  以下是gcc4.8.5里邊的代碼

       

       

       

       

       

       

       

       

      大概意思是, gcc使用libasan之后, hock了longjmp, 在真正進入longjmp之前調用函數__asan_handle_no_return() 進行內存檢測.

      在該函數里, top是之前保存的調用棧的棧頂.  &local_stack是取了臨時變量的地址也就是當前使用的調用棧的棧底地址.

      然后會memset, 把整個調用棧(maybe?) 寫0,  而我當前出現的問題就是臨時變量的地址沒有取到pthread的調用棧的地址上.

      所以兩個一減, size就特別大.

       

      我們知道調用棧的地址是0x7fff是正常的, 這個local_stack的0x609200值,很明顯是不正常的, 從而導致了size不正常, 接下來繼續分析

      這個值為什么是這樣的.

       

      二  async

      上文中調用棧的值的變化,主要是由api setcontext 導致的,  見如下:

       

       

      上文中提到的OOM復現過程是這樣的, openssl進入SSL_accept函數之后, 在61行進行了第一次上下文切換, 之后在第59行進行了如上文調用棧圖片所示的,

      有qatengine觸發的第二次上下文切換. 于是進入了libasan的__asan_handle_no_return()  并觸發OOM.

       

      setcontext函數切換了整個調用棧的棧指針, 所以會有上文0x60開頭的棧地址,而不是0x7f, 如下圖的registers的rsp可見:

      函數調用前:

       

       

      函數調用后:

       

       

      擴展

      longjmp與setcontext都是用來做上下文切換的API, 功能可以相互替換.

      setcontext之所以使用了新的地址,而不是就得0x7f地址, 推測是為了提高效率防止拷貝. 帶來的一個隱形壞處是gdb不能繼續單步執行, 單步執行的下一步就是它

      切回來的時候,  繼續使用gdb的方法是, 在即將切換的那個函數上加一個斷點.

       

      longjmp沒有這個gdb的困擾問題, 推測它每次切換都會做一次棧拷貝.

       

      此類API的主要用途:  實現協程,  實現信號處理, 實現異常處理.

       

      posted on 2021-01-04 19:26  toong  閱讀(1002)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 汉沽区| 国产精品一区二区三区日韩| 亚洲av激情一区二区三区| 国产精品会所一区二区三区 | 国产影片AV级毛片特别刺激 | 狠狠躁夜夜躁人人爽天天古典| 99久久精品费精品国产一区二区 | 久久99精品国产麻豆婷婷| 日韩av在线一卡二卡三卡| 亚洲精品一区二区妖精| 久久亚洲精品成人综合网| 巨爆乳中文字幕爆乳区| 国产一区二区不卡在线| 成年午夜免费韩国做受视频| 人妻精品久久无码专区精东影业| 国产高清国产精品国产专区| а∨天堂一区中文字幕| 一本色道国产在线观看二区| 精品少妇人妻av无码久久 | 国产福利萌白酱在线观看视频| 亚洲成在人天堂一区二区| 北碚区| 翘臀少妇被扒开屁股日出水爆乳| 欧美一本大道香蕉综合视频| 国产精品久久久久久久网| 东京热加勒比无码少妇| 99精品高清在线播放| 亚洲av影院一区二区三区| 国产精品无遮挡一区二区| 无码精品人妻一区二区三区中| 福利成人午夜国产一区| 特克斯县| 激情综合色综合久久丁香| 亚洲精品国模一区二区| 湘潭县| 无人区码一码二码三码区| 亚州中文字幕一区二区| 亚洲人妻一区二区精品| 亚洲精品中文字幕二区| 亚洲精品色哟哟一区二区| 成人欧美日韩一区二区三区|