2017-09-03 41 views
-1

我有點困惑第一個shellcode示例如何工作。我已經通過GDB運行了它,並且我已經驗證它是正確的,但我不確定它如何最終在第一個地方工作。下面是代碼的樣子:(其實我已經取代了最初產生一個外殼的shellcode到一個輸出「Hello World」,但不應該有太大的差異)Shellcoder's Handbook:第一個shellcode示例

char shellcode[] = 
"\xeb\x13\x59\x31\xc0\xb0\x04\x31\xdb\x43\x31\xd2\xb2\x0f\xcd\x80" 
"\xb0\x01\x4b\xcd\x80\xe8\xe8\xff\xff\xff\x48\x65\x6c\x6c\x6f" 
"\x20\x77\x6f\x72\x6c\x64\x0a\x0d"; 

int main() 
{ 
    int *ret; 
    ret = (int *)&ret + 2; 
    (*ret) = (int)shellcode; 

    return 0; 
} 

ret如果只有一個整數指針,它應該只有4個字節長,它該如何工作? shellcode本身大約有40個字節長!如果有的話,所有ret應該retreive是shellcode的前4個字節,而不是執行整個事情!

有人可以請向我解釋這是如何工作的?

回答

-1

它依賴於編譯器(和芯片有關),但是我認爲發生的事情是它依賴於這樣一個事實,即在堆棧2的位置int從自動變量的起始位置開始是返回地址應該從流程返回時跳回。它用shellcode []數組的地址替換該地址,所以當main()返回時,它將執行那裏的指令。