作者rock1985 (疾風)
看板C_and_CPP
標題Re: [問題] Buffer overflow 和 Instruction address
時間Tue Dec 14 14:22:48 2010
題目:
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