[英]How to exploit a buffer overflow to execute instructions on the stack
我開始修補緩沖區溢出,並編寫了以下程序:
#include <unistd.h>
void g() {
execve("/bin/sh", NULL, NULL);
}
void f() {
long *return_address;
char instructions[] = "\xb8\x01\x00\x00\x00\xcd\x80"; // exit(1)
return_address = (long*) (&return_address + 2);
*return_address = (long)&g; // or (long)instructions
}
int main() {
f();
}
它做了我期望它做的事: return_address
用地址g
覆蓋f
的返回地址,這將打開一個shell。 但是,如果我將返回地址設置為instructions
,則會出現分段錯誤,並且沒有執行指令中的任何instructions
。
我用GCC編譯,使用-fno-stack-protector
。
如何防止發生此分段故障?
至少有一個問題與緩沖區溢出無關。
execve("/bin/sh", NULL, NULL);
第一個NULL成為您正在啟動的進程的argv。 argv必須是以NULL 結尾的字符串數組。 因此,當/bin/sh
啟動時,可能會發生段錯誤,嘗試讀取argv[0]
,並取消引用NULL。
void g(void) {
char *argv[] = { "/bin/sh", NULL };
execve(argv[0], argv, NULL);
}
您還可以將-z execstack
添加到gcc命令行,這將告訴鏈接器允許可執行堆棧。 如果你從教程中獲得它們,你還應該驗證你在那里的指令是什么exit(1)
編譯到你的系統上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.