# 10.06 SUS 培训
# 基本知识点
1. 程序在 32 位中传递参数为 栈传递,在 64 位中通过寄存器传递
2. 变量存储
- 未初始化的全局变量 存放在 BSS 段
- 初始化的全局变量存放在 Data 段
- 函数存放在 Text 段
- 局部变量存放在栈段
- 主动申请的内存在堆部分
- read 函数等存放在 shared libraries
# 简单栈溢出
# ret2text
print name
将 0x100
的数据拷贝到 只有 15 个字节的 buf
中,就会溢出。读入超过 15 字节的数据,就会将下面的内容覆盖,把返回地址的值覆盖为 shell()
函数的地址,就可以跳转到 shell
完成攻击。
一般的,先使用 checksec
查看保护机制:
NX
有效防止 shellcode注入
攻击。 PIE
地址随机化的保护。
攻击代码如下:
至少 15 个字节将 buf 覆盖掉,再写 8 个字节将 ebp 覆盖掉,最后再覆盖返回地址,覆盖为后门函数的返回值。但是这样会导致栈没有对齐,从而报错。于是利用查看 ret 的地址:
将 ret 填充到 8 结尾的内容中,这样 shell 会以 0 结尾开始运行从而对其 16 字节不报错。pwn 的解法很多,这只是本题其中一个解法。
# ret2shellcode
本题目没有后门函数,需要自行编写 shellcode
题目会将 buf 在栈上的地址告诉你,我们将 buf 的返回地址改为 buf 在栈上的开始地址:
shellcode 可以用系统自动生成的,也可以用自己写的,编译 shellcode 的能力还是很重要的。可以在 shellcodes databsase 网站中学习。
# ret2libc
该题开启了 NX 并且没有后门函数。使用 ldd,查看动态库发现有 libc,于是该题从 libc 中开始找。libc 的地址是随机的,但是 write 函数的地址在 libc 中是相对的,知道了就可以获得 libc 的地址。