<pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
    <pre id="vvttv"></pre>

      <p id="vvttv"></p>

          <p id="vvttv"></p>

                <p id="vvttv"></p>

                <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                  <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                    <p id="vvttv"></p>

                    原文地址:http://drops.wooyun.org/papers/6559

                    前面的文章中,我已經介紹了如何調試被加殼的ELF,這里不在敘述,直接進入正題,以某加固為例,如何DUMP和修復被加殼的ELF,使其能調試加載

                    我們先來看看被加殼ELF的頭和Program Header

                    enter image description here

                    enter image description here

                    首先我要讓調試器停在入口點0x3860的位置

                    開始DUMP修復之旅,我的第一次DUMP修復的方法,延續了PE的思路,結果失敗了

                    失敗的原因并不是思路不對,而是細節上出現問題

                    第一次DUMP的方法:

                    1.廢除不影響加載的section(直接把結構體填0),只關心PT_LOAD和PT_DYNAMIC兩種類型節 2.計算DUMP文件最大值 align_up(0x28ca4, 0x8000) = 0x31000 3.將offset和va變成相等值,filesize和memsize按照align對齊 4.根據PT_LOAD節數據把數據DUMP出來,把DUMP數據放進文件里

                    那么根據上圖描述數據,應該有兩塊兒

                    PT_LOAD : 0 ----align_up(0x12044, 0x8000) = 0 ----- 0x1B000
                    PT_LOAD : align_down(0x28ca4,0x1000) = 0x28000 ---- align_up(0x28ca4, 0x8000) = 0x31000
                    

                    因為安卓也是linux內核,內存頁對齊粒度為4K(0x1000)

                    按照上述方法DUMP完,我們來看看IDA加載以后,JNI_ONLOAD的樣子

                    enter image description here

                    看下紅色的部分,奇怪了,本來應該有的代碼去哪里了??

                    0x221b0這個地址竟然無效

                    可是動態調試器中明明可以看到這段代碼:

                    enter image description here

                    對照Program Header, 再看0x221b0這個地址,PT_LOAD節中并沒有描述這個地址 所以,失敗就是在這個地方,殼的代碼里一定是mmap了這段內存,將解密后的數據,放進去,并修改了內存屬性

                    通過跟蹤殼代碼,發現確實如此,殼代碼通過svc 0,調用了mmap,mprotect兩個函數

                    mmap(0x3000, 0x23710, 0x3, 0x32, 0xffffffff, 0x0)  
                    map頁屬性:PROT_READ | PROT_WRITE
                    mprotect(0x3000, 0x23710, 0x5)  
                    

                    修改頁屬性:PROT_READ | PROT_EXEC 具體參數說明請參考幫助文檔

                    這段區域起始地址:0x3000 大小:align_up(0x23710, 0x1000) = 0x24000 結束地址:0x3000 + 0x24000 = 0x27000 0x221b0這個地址正好在0x3000---|0x27000這個范圍里

                    通過上述過程,重新總結DUMP方法如下

                    1. 廢除不影響加載的section(直接把結構體填0),只關心PT_LOAD和PT_DYNAMIC兩種類型節
                    2. 計算DUMP文件最大值 align_up(0x28ca4, 0x8000) = 0x31000
                    3. 只保留一個PT_LOAD節,從0到0x31000 將整塊兒數據DUMP下來直接寫入文件,修改align為0x1000,修改flag為RWE
                    4. 修改PT_DYNAMIC節的offset,和VA相等 修復完的節表如下:

                    enter image description here

                    最后一個注意的地方,就是干掉INIT段或者是INIT_ARRAY段

                    干掉INIT方法:定位INIT描述的數據偏移,將偏移+8的數據,前移8個字節

                    干掉INIT_ARRAY方法:定位到VA處,按照結構,將數據填充為0xffffffff或者0

                    看下圖,INIT段已經不存在了

                    enter image description here

                    我們來打開IDA,加載修復的文件,看看效果:

                    enter image description here

                    enter image description here

                    數據完整,再看看動態加載的效果

                    enter image description here

                    加載成功~~~

                    哈哈,至此,修復完成

                      <pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
                      <pre id="vvttv"></pre>

                        <p id="vvttv"></p>

                            <p id="vvttv"></p>

                                  <p id="vvttv"></p>

                                  <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                                    <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                                      <p id="vvttv"></p>

                                      这里只有精品视频