1. 题目分析与漏洞定位
这道CTF题目来自2019年全国大学生信息安全竞赛(CISCN)的线上赛题"ciscn_2019_en_2",考察的是基础的栈溢出漏洞利用技术。我们先从静态分析开始:
1.1 程序功能分析
使用IDA Pro反编译后可以看到,程序主要实现了一个加密装置的功能。主函数中提供了选择菜单:
c复制int __cdecl main(int argc, const char **argv, const char **envp)
{
int v4; // [rsp+Ch] [rbp-4h]
setvbuf(stdin, 0LL, 2, 0LL);
setvbuf(stdout, 0LL, 2, 0LL);
puts("Welcome to this Encryption machine\n");
while (1)
{
while (1)
{
begin();
printf("Input your choice!");
v4 = getchar();
getchar();
if (v4 != '1')
break;
encrypt();
}
if (v4 == '2')
break;
puts("Invalid input!");
}
return 0;
}
程序的核心功能在encrypt()函数中实现,这也是我们后续漏洞利用的关键点。
1.2 漏洞发现过程
在encrypt()函数中,我们发现了一个明显的栈溢出漏洞:
c复制char s[48]; // [rsp+0h] [rbp-50h]
...
fgets(s, 0x100, stdin);
这里定义了一个48字节的缓冲区s,但却使用fgets读取了最多0x100(256)字节的数据,造成了栈溢出。通过计算可以确定:
- 缓冲区大小:0x50(80)字节(包含rbp)
- 返回地址偏移量:0x50 + 8 = 88字节
注意:在64位系统中,返回地址保存在rbp+8的位置,所以实际偏移量是缓冲区大小+8字节
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
