real-blog 14735-总结 CMU 14-735 Secure Coding (24Fall) 总结 课程总述 MSIN 项目的学生要求在 intro to info sec 和 secure coding 中选一门 Security 的课程。因为对 CTF (Capture The Flag) 比较感兴趣所以更加偏向于这门课。虽然这门课有 513 的先修课要求, 第一节课和 Hannan 沟通了一下,说明了这学期同时也在上 513, 并且之前学过C,于是同意了让我这学期修这门课。这门课的核心是通过解决 CTF 来发现 C program 中的 vulnerability,包含 stack, pointer, memory, integer, format string 等内容,还引入了两道新的 blockchain 的 ctf 题目。还有一些比较基础的比如 fuzzing test (模糊测试),以及一个大项目其中包括 build-it, break-it and fix-it。 课程成绩 (A) 这门课是采用的 specification grading, 其实就是从 A 到 D 根据不同的 level 来设定不同的成绩达成目标。比如对于 A 来说,23个 CTF 只能最多有一个是 NS (Non-Satisifed),并且需要解决最难的 Integer 2。这样评分的好处肯定在于每个人都可以朝着自己期望的成绩去规划,但是有一点乏善可陈的地方就是如果我完成了所有的任务,却发现在 C- level 里面的一项任务 (fuzzing section1) 因为 write-up 没有完全达到标准而给了 Non-Satisfied,那么我最后只能取得比 C- 更低的成绩,也就是 D 。不过TA 和老师也发现了这个问题,给了一些题目 retry 的机会。最后也是完成了所有的 CTF 题目拿到了A。 课程内容 顾名思义,Secure Coding 当然是讲的不安全代码会带来什么样的危害。主要通过 CTF 的形式去让学生作为一个黑客去通过漏洞以不同的形式去攻击程序。对于CTF,需要用到 gdb, pwntool 等工具去进行 exploit。GDB 用到了助教推荐的插件 Peda,使得寄存器,栈上面信息等内容可以一目了然,便于我们去 exploit。因为 CTF 的题目基本上都是 32 位(除了 Bonus question),所以需要提前配置好环境。 起初是使用的 AWS 的云服务器,后面有一次 SSH 不知道为什么连不上去了,为了减少每次因为连接带来的问题,就换成用 WSL 来做了。直到有一次发现一个函数 wctomb (将wchar_t 转化为 multi-byte array) 在 WSL 上面始终不能产生和 linux 系统一样的效果,于是就只有又换成了 GCP 来连接。不得不说 GCP 的 三个月300刀 bonus 相比于 AWS 的一年免费使用的 1G 机器 速度和性能好不少。再回到 CTF 的 exploit,通常是在本地通过 gdb 进行调试,然后再向部署在 picoCTF 上的服务发起请求,最后让它把 flag 给吐出来。pwntool的好处是:1. 在我们构造 payload 的时候,通过 p32()可以高效地帮我们去构造符合计算机小端格式的 payload。2. 在我们需要注入可执行的代码时, pwntool 提供了很多函数来帮我们直接生成其代码,而不需要去看对应的汇编指令来构造。在 memory 章节的时候,我们需要用到这个方式来 fork 一个 shell ,让我们在这个 shell 当中输入 cat flag.txt 来获取到最终的 flag。这个时候 pwntool 就能很方便地帮我们去完成构造所要注入代码的操作。当时在做这道题的时候有一件有意思的事情,在做这一个题的时候,因为掌握到了 shell的权限,有一个同学直接把当前文档里面的flag.txt给删掉了,这样后面的同学就拿不到里面的内容了。助教特别发帖强调说再这样做违反了 Academic Integrity。后面就没人敢再这么干了 XD.3. 在我们需要和部署在 picoCTF 的程序进行动态构造或者多次请求的时候,我们需要利用 pwntool 来发送请求并且动态获取当前信息 (往往为动态分配在堆上的地址),从而指导我们下一步应该怎么进一步去构造 payload。然后对于 fuzzing test,第一部分是通过 AFL++ 这个 fuzzer 去模糊测试 OpenSSL 的著名的 Heatbleed的 vulnerability。这里直接使用提供的docker image 作为开发环境。第二部分需要自己在 Github 上面去找到一个不是提供 fuzzing test 已经发现的漏洞程序来进行测试。最后是 build it -- break it -- fix it。这个项目的主要内容是要我们去建立一个安全文件管理系统 (build-it),用户可以register, write, read 等操作。相比于 15-513的最后一个 sfs (secure file system) lab,这里是单线程的系统并且侧重点在于用户信息的安全而非线程安全。在 break it 的时候,需要根据课程给出的代码和其他组的代码来进行 break 。好在有的组使用了明文存取等安全性较低的方式,让我们很容易进行地进行 exploit,最终顺利地完成了这部分的任务。最后对于 fix it,我们需要先将之前build-it 搭建的不安全的代码使用 C2rust 来转化为 rust 代码,并且修复编译的错误,在第二部分需要将 rust 代码里面的 unsecure 部分通过 rust 的用法来修复,比如 C 中不安全的 strcpy ,malloc 等。 课程感受 总的来说这门课尤其是 CTF 的部分是很有趣的,尤其是花了很长时间终于做出一道 CTF 题看着它吐出来 flag 的那个瞬间是很有成就感的。其中用到的资料包括 CTF wiki 也带给了我很多帮助。正好这一个学期有一件比较有意思和很火的事情,就是从最初的大学生去做小猿口算到后来的通过OCR识别解题再到最后的破解修改程序使得小猿官方不得不高薪聘用反爬虫工程师,安全方面其实还是挺有意思的。之前看了一些安卓逆向,粗浅地了解到脱壳等等概念,一直都很佩服吾爱破解论坛里面的大神。看到后面 cmu 还有一门 browser security,到第四学期还有时间的话看能不能上一下这一门课吧。 December, 2024 admin