代码审计入门

获得源码

编辑 /etc/apt/sources.list,需要有一个 deb-src 项作为源码仓库。然后执行 apt update && apt source netcat 就可以获得对应软件的源码。

代码审计工具(Static Code Analysis Tool)

Flawfinder 开源的 C 语言审计工具

pip install flawfinder
.local/bin/flawfinder --html path_to_source/code.c > desktop/out.html

使用 Visual Studio 进行代码分析

内置分析器

  1. 创建解决方案
  2. 将源码加入解决方案
  3. 点击“分析” > “运行代码分析” > “针对解决方案”

分析函数

对可能存在(溢出、UAF、DoubleFree 等)问题的函数上右键,“查看调用层次结构”,分析传入参数是否用户可控。

基本思想

  1. 寻找潜在的漏洞发生地点
  2. 如何到达存在漏洞的函数(用户可控)
  3. 是否可以利用(危害程度)

常见漏洞

格式化字符串漏洞

  • 如果格式化串是一个指针,而非字符串字面量,则可能存在漏洞。如 printf(argv[1])

溢出漏洞

  • 如果存在 memcpystrcpy、手写循环等代码,仔细分析是否可能存在溢出。
  • 使用 memcpy 时,使用 src 的长度进行复制,如果这个长度超过 dst 的长度就会溢出。
  • 使用 strncpy 时,如果 n>src 的长度,最多复制 src 的长度个字符,不足 n 的长度填充 \0 直到一共 n 个字节。如果 n<=src 的长度,只是将 src 的前 n 个字符复制到 dst 的前 n 个字符,不自动添加 '\0',需要再手动添加一个 '\0'srcdest 所指内存区域不可以重叠。

垂悬指针(UAF、DoubleFree)

  • 观察箭头调用 -> 时,对象是否可能已被释放。
  • 观察 deletefree 时,对象是否可能已被释放。
  • 观察已释放的对象是否可能被重复使用,如果指针没有置空则可能存在漏洞。

算术运算

  • 有符号数的运算中掺有了无符号数,便会发生变量类型的传播,即隐形转换以后,整个比较都会以无符号数的方式来进行。
  • 进行(有符号和无符号数的)算术运算时,可能存在整数溢出。
  • 浮点数的不精确性是否可能造成漏洞。

类型混淆

  • 当存在可转换类型时,是否可能因为类型错用导致问题

错误理解 API 的参数和返回值

  • 如果程序员没有仔细看API手册,错误理解参数或返回值的含义时,可能造成问题。如 sprintf 的返回值为实际写入的字符串长度,但 snprintf返回值为本应写入的长度(实际上这个长度被 n 限制了),而非实际写入的长度。

错误地使用宏

  • 待补充

危险函数

  • system()
  • getenv()
  • fopen()

参考

……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值