2
我已經給了一個C代碼文件,其中給出正確的輸入發生緩衝區溢出,然後授予root訪問權限。這是一個使用ZShell的Fedora bug。爲了測試這個(安全主題),我們禁用了Linux內核中啓用的隨機內存地址分配。測試緩衝區溢出
我被要求測試不同的輸入,直到出現分段故障,其中輸入是緩衝區大小。我沒有得到的是,爲什麼我應該用不同的值進行測試?我不確定代碼會有幫助,但我不知道改變輸入的重點。
/* vulnerable.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
unsigned char buf[] =
"\x31\xc0" /* xorl %eax,%eax */
"\x50" /* pushl %eax */
"\x68""//sh" /* pushl $0x68732f2f */
"\x68""/bin" /* pushl $0x6e69622f */
"\x89\xe3" /* movl %esp,%ebx */
"\x50" /* pushl %eax */
"\x53" /* pushl %ebx */
"\x89\xe1" /* movl %esp,%ecx */
"\x99" /* cdql */
"\xb0\x0b" /* movb $0x0b,%al */
"\xcd\x80" /* int $0x80 */
;
/* -------------------------------------------------- */
void vuln(char * buf)
{
char a[16] = { 0 };
strcpy(a, buf);
}
int main(int argc, char * argv[])
{
int *ret;
if (argc != 2)
{
printf("Usage: %s <input>\n", argv[0]);
exit(1);
}
vuln(argv[1]);
printf("%p\n", buf);
return 0;
}
要開始,我會建議嘗試溢出'valgrind'中的輸入並查看堆棧值等。但是,您是否編寫了程序集並自己獲取了字節碼?這樣做可能更有意義。另外,確保你有一個可執行的堆棧。改變輸入點最有可能確定堆棧發生了什麼。 – RageD
你知道*什麼時候會出現分段錯誤?你知道如何在不改變輸入的情況下導致它,或者提供不同的輸入嗎?實驗。 –
你可能有一些筆記與作業一起去。他們可能在某個時候討論堆棧佈局,重新閱讀它們。當調用'vuln'函數時,堆棧中有一些空間用於(除其他外)數組'a'和返回地址。當您嘗試將更多數據寫入'a'時,會發生什麼情況比適合?輸入一些容易識別的數據作爲輸入。獲取段錯誤並保存核心轉儲。在GDB中打開核心轉儲。現在看看寄存器。通過改變輸入的長度來查看是否可以獲得特定的值以顯示在EIP中。 –