gets
参考 CSAPP P1951
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using namespace std;
extern "C" int shell();
char* gets(char* s) {
int c;
char* dest = s;
while ((c = getchar()) != '\n' && c != EOF) {
*dest++ = c;
}
if (c == EOF && dest == s)
return NULL;
*dest++ = '\0';
return s;
}
int shell()
{
return system("/bin/sh");
}
int main()
{
char v1;
gets(&v1);
return 0;
}
- 修改 version2
1 |
|
- 关闭保护
1 | g++ -fno-stack-protector -z execstack -no-pie stack.cpp -o stack |
- 得到可执行文件 stack,拿到 IDA 64 反编译
checksec --file=stack
结果如下
- vuln 函数如下
- 栈信息如下,因此需要覆盖 9 个字符到达返回地址
- shell 地址 0x4006F4;shell 的 retn 地址 0x400705(因为本地环境是 Ubuntu 18,所以要做堆栈平衡需要知道 retn 地址)
- exp.py 代码如下
1 | from pwn import * |
python exp.py
,可以打通本地,结果如下