看板 C_and_CPP 關於我們 聯絡資訊
題目:http://isis.poly.edu/courses/cs392-f2010/labs/HW6.pdf 我想問一下大家第2題 這支是原來的程式 #include <stdio.h> #include <stdlib.h> //BEGIN:A program to illustrate buffer overflow //vulnerability void func(char *str) { char buffer[24]; int *ret; strcpy(buffer,str); } int main(int argc, char **argv) { int x; x = 0; func(argv[1]); x = 1; printf("x is 1\n"); printf("x is 0\n"); } //END 這支是用來CALL上面的程式 #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { char shellcode[] = "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"; execl("./vuln.exe", "test",shellcode,"test",NULL); return 0; } 我現在的想法是 我在shellcode裡面放進一些code例如可以修改return address或是jmp之類的code 之後用NOP去把buffer 和 stack灌爆 不過我剛剛測試了一下 即使塞一大堆的NOP在buffer裡面,似乎沒有影響到stack上的情況 我是想說如果用NOP把stack上面的東西都蓋掉 -----------------------------------------> ---------------------------------------- jmp NOP NOP NOP NOP NOP NOP NOP ---------------------------------------- 因為stack上的東西不見了 所以他就順著NOP執行回去 但是NOP沒做事情 所以就一路碰到jmp -----------------------------------------> ---------------------------------------- jmp NOP NOP NOP NOP NOP NOP NOP ---------------------------------------- 是不是就能達到利用buffer overflow去修改return address的值呢? 麻煩大家給我一點意見 謝謝 -------------------------------------------------------------------- 這個題目我現在改出來的版本是(第一題) #include <stdio.h> #include <stdlib.h> #include <string.h> //BEGIN:A program to illustrate buffer overflow //vulnerability void func(char *str) { char buffer[24]; int *ret; /**以下我是我改的部分**/ int temp; temp = sizeof(buffer) - 1; strncpy(buffer,str,temp); buffer[23]='\0'; ret = buffer+44; (*ret) += 14; } int main(int argc, char **argv) { int x; x = 0; func(argv[1]); //func("12345678987654321234567898765432123456789"); //func("123456789876543212345678987654321"); //func("123456789876543212345678987654321"); x = 1; printf("x is 1\n"); printf("x is 0\n"); return 0; } //END 我用版友的建議 利用CALL3次func然後印出stack去觀察 我有兩個覺得奇怪的地方 第一是 我觀察的時候發現3次call func的時候 只會有一個部份的stack值會不一樣 所以我認為那是return address的值 所以我用buffer+44指過去 然後每個return address的值差12 所以我一開始認定是一個指令長度為12 但是發現如果只+12 程式會當掉 結果誤打誤撞+14卻可以執行 讓我有點搞不懂為什麼 第二是 現在程式的確可以跳過x is 1這行 只印出x is 0 不過她同時也會印出call func時候的input 這又是為什麼呢?? 越來越糊塗了 麻煩大家幫我解答一下疑問 謝謝大家 -- 我不是宅 我只是比較居家 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 108.6.66.40
loveme00835:你要用組語的指令長度來看 12/14 14:55
LPH66:作業提示中的 objdump 可以去稍微研究一下其結果 12/14 16:30
rock1985:第2題我正準備開始研究,剛剛才處理完第一題 12/14 22:11
rock1985:感覺又是另一個難關 12/14 22:12
※ 編輯: rock1985 來自: 108.6.66.40 (12/15 11:21)
alongalone:真有趣的課,上電腦安全只會提過根本沒實作.....Orz 12/16 00:35