看板 C_and_CPP 關於我們 聯絡資訊
#include <stdio.h> #if 0 0: b8 01 00 00 00 mov $0x1,%eax 5: bb 00 00 00 00 mov $0x0,%ebx a: cd 80 int $0x80 #endif char __attribute__ ((section (".text"))) shellcode[] = "\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80"; typedef void (*FUNCPTR)(); int main() { printf("<< Shellcode begin >>\n"); FUNCPTR fp = (FUNCPTR)shellcode; fp(); } 我稍微改了一下, 你測試一下看看能不能執行。 我的環境: ubuntu 10.04 64bit gcc -c -g -m32 s.c /tmp/ccSVr2p2.s: Assembler messages: /tmp/ccSVr2p2.s:12: Warning: ignoring changed section attributes for .text gcc -o s -g -m32 s.o 執行結果 descent@w-linux:shellcode$ ./s << Shellcode begin >> descent@w-linux:shellcode$ 我猜測原因是 shellcode[] 落在 .rodata, 無執行權限, 所以收到 signal, 得到 segment fault。 把 shellcode[] 改到 .text 即可。 另外你的 shellcode 好像有點問題, 我稍微改了一下。 編譯 -m32 是因為我看不懂反組譯的 64 bit code, 所以改用 32bit, 沒有加上 -m32 也是可以正常執行。 ※ 引述《a613204 (胖胖)》之銘言: : #include <stdio.h> : char shellcode[] = : "\xb0\x01\x31\xdb\xcd\x80"; : typedef void (*FUNCPTR)(); : int main() { : printf("<< Shellcode 開始執行 >>\n"); : FUNCPTR fp = (FUNCPTR)shellcode; : fp(); : } : 運作環境是Ubuntu 12.10 : 想說先弄一個最簡單的範例 , 只有exit的功能 : 但執行時一直出現記憶體區段錯誤 不知道是什麼原因 : 上網查了一下 利用gcc編譯時也加上了-z execstack : 還是一樣 請問有人知道原因嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.125.239.46 ※ 編輯: descent 來自: 59.125.239.46 (11/19 11:54)
cobrasgo:這樣改就沒意義啦XDD 11/19 18:23
descent:為什麼呢? 11/19 20:58
cobrasgo:拍謝我看錯了XD 11/20 00:29
a613204:感恩 好像是code有問題 11/20 09:47