[問題] Buffer overflow 和 Instruction address
題目: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
→
12/14 14:55, , 1F
12/14 14:55, 1F
推
12/14 16:30, , 2F
12/14 16:30, 2F
→
12/14 22:11, , 3F
12/14 22:11, 3F
→
12/14 22:12, , 4F
12/14 22:12, 4F
※ 編輯: rock1985 來自: 108.6.66.40 (12/15 11:21)
推
12/16 00:35, , 5F
12/16 00:35, 5F
討論串 (同標題文章)
完整討論串 (本文為第 3 之 4 篇):