利用符号执行去除控制流平坦化 发表于 2017-01-31 | 分类于 逆向工程 | 暂无评论 # 1. 背景 ## 1.1 控制流平坦化 控制流平坦化(control flow flattening)的基本思想主要是通过一个主分发器来控制程序基本块的执行流程,例如下图是正常的执行流程 ![image_1b6tbj30u6pc1c361ftd13ca1vfjn.png-9.7kB][1] 经过控制流平坦化后的执行流程就如下图 ![image_1b6td3nbf8hl185kf8f7ugn2d14.png-13.7kB][2] 这样可以模糊基本块之间的前后关系,增加程序分析的难度,同时这个流程也很像VM的执行流程。更多控制流平坦化的细节可以看[Obfuscating C++ programs via control flow flattening][3],本文以[Obfuscator-LLVM][4]的控制流平坦化为例。 [1]: http://static.zybuluo.com/birdg0/8opczl4idqc0zsw7mkkfaghv/image_1b6tbj30u6pc1c361ftd13ca1vfjn.png [2]: http://static.zybuluo.com/birdg0/x8mc397bj2al3pivppeep3z2/image_1b6td3nbf8hl185kf8f7ugn2d14.png [3]: http://ac.inf.elte.hu/Vol_030_2009/003.pdf [4]: https://github.com/obfuscator-llvm/obfuscator/tree/llvm-3.6.1 [5]: https://pdfs.semanticscholar.org/a29f/c90b207befb42f67a040c6a07ea6699f6bad.pdf [6]: http://dslab.epfl.ch/pubs/selsymbex.pdf [7]: http://mir.cs.illinois.edu/marinov/publications/SenETAL05CUTE.pdf [8]: https://github.com/JonathanSalwan/Triton [9]: https://github.com/angr/angr [10]: http://static.zybuluo.com/birdg0/wxx18tv5ric5wknyj4l6im5k/image_1b708vp9hi4k31r1fq4ei01l1c9.png [11]: http://static.zybuluo.com/birdg0/bujceez9oc7smst2f44cchz2/image_1b70ac22pbru153717be17ttcr3m.png [12]: http://blog.quarkslab.com/deobfuscation-recovering-an-ollvm-protected-program.html [13]: https://github.com/programa-stic/barf-project [14]: https://github.com/angr/angr-management/blob/master/angrmanagement/utils/graph.py [15]: http://static.zybuluo.com/birdg0/6bavjjtzbizgk20ywnjrk90y/image_1b72oboes1nujq144nspep120o1t.png [16]: http://static.zybuluo.com/birdg0/en19d7sqsly89wfj1bwhtbft/image_1b72muut91qdb15ms1knnish1tom.png [17]: http://static.zybuluo.com/birdg0/qgdi8y6gljpymbpqj9tienck/image_1b72nf28b1ovl1v571i3a1q9g1l9t13.png [18]: https://security.tencent.com/index.php/opensource/detail/18 [19]: https://security.tencent.com/index.php/opensource/detail/18 [20]: http://ac.inf.elte.hu/Vol_030_2009/003.pdf [21]: https://github.com/obfuscator-llvm/obfuscator/tree/llvm-3.6.1 [22]: https://pdfs.semanticscholar.org/a29f/c90b207befb42f67a040c6a07ea6699f6bad.pdf [23]: http://dslab.epfl.ch/pubs/selsymbex.pdf [24]: http://mir.cs.illinois.edu/marinov/publications/SenETAL05CUTE.pdf [25]: https://github.com/JonathanSalwan/Triton [26]: https://github.com/angr/angr [27]: http://blog.quarkslab.com/deobfuscation-recovering-an-ollvm-protected-program.html [28]: https://github.com/programa-stic/barf-project [29]: https://github.com/angr/angr-management 阅读全文 »
33C3 CTF babyfengshui writeup 发表于 2016-12-31 | 分类于 漏洞利用 | 暂无评论 # 1. 漏洞分析 程序开启了DEP,主要包含四个功能: 1. 添加用户 2. 删除用户 3. 显示用户 4. 更新用户 User结构体为 ```c struct User { char *description; //大小由自己定义 char name[124]; }; ``` 阅读全文 »
Linux Kernel ROP 发表于 2016-09-16 | 分类于 漏洞利用 | 3 条评论 > 这篇博客是对[Linux Kernel ROP - Ropping your way to # (Part 1)][1]和[Linux Kernel ROP - Ropping your way to # (Part 2)][2]的学习总结 # 1. Kernel ROP 在内核漏洞利用中一般会涉及到提权,最经典的就是通过**ret2user**攻击执行用户空间的如下代码来实现 ```c void __attribute__((regparm(3))) payload() { commit_creds(prepare_kernel_cred(0); } ``` 随着漏洞利用缓解技术的发展,Intel CPU新增了类似用户层的**DEP**防御措施**SMEP**,这可以使在内核层不能执行用户空间的代码而只能执行内核空间的代码,跟绕过DEP类似可以使用Kernel ROP来绕过SMEP。例如在x86_64架构下可以使用如下ROP链来进行提权 ![image_1b7nfsirn172t1vvea3j1o2e1evh9.png-14.4kB][3] [1]: https://www.trustwave.com/Resources/SpiderLabs-Blog/Linux-Kernel-ROP---Ropping-your-way-to---%28Part-1%29/ [2]: https://www.trustwave.com/Resources/SpiderLabs-Blog/Linux-Kernel-ROP---Ropping-your-way-to---%28Part-2%29/ [3]: http://static.zybuluo.com/birdg0/r1an5krwuh83d4mlfbmm8zgz/image_1b7nfsirn172t1vvea3j1o2e1evh9.png [4]: http://static.zybuluo.com/birdg0/kchjf9kn6q8frgpko5y8uhuz/image_1b7nrctsi1b51oq16431aou1ctj9.png 阅读全文 »
2016 ALICTF xxFileSystem writeup 发表于 2016-06-15 | 分类于 逆向工程 | 暂无评论 # 0x00 简介 这是关于文件系统的一个题,给了程序和数据,比赛时是分成了两部分,第一部分是需要我们恢复删除的文件,第二部分是需要解密加了密的文件。比赛完时有挺多队把第一部分解出,但第二部分只有PPP解出,我赛后在队友wxy前期的分析和出题人的帮助下才解了出来,这里仅做一个分享,各位大大忽喷。 阅读全文 »
WebLogic之Java反序列化漏洞利用实现二进制文件上传和命令执行 发表于 2015-12-29 | 分类于 Web安全 , 漏洞利用 | 2 条评论 # 0x00 前言 Java反序列化漏洞由来已久,在WebLogic和JBoss等著名服务器上都曝出存在此漏洞。FoxGlove Security安全团队的breenmachine给出了详细的分析,但没有给出更近一步的利用方式。前段时间rebeyond在不需要连接公网的情况下使用RMI的方式在WebLogic上实现了文本文件上传和命令执行,但没有实现二进制文件上传。我通过使用Socket的方式实现了二进制文件上传和命令执行,同时也实现了RMI方式的二进制文件。 # 0x01 思路 首先发Payload在目标服务器中写入一个Socket实现的迷你服务器类,所有的功能都将由这个迷你服务器来执行,然后再发一个Payload来启动服务器,最后本地客户端创建Socket连接的方式向服务器发送请求来使用相应的功能,其中上传二进制文件我采用分块传输的思想,这样可以实现上传较大的文件。 1. 本地创建Socket实现的迷你服务器类并导出jar包 2. 把jar包上传至目标服务器 3. 启动目标服务器上的迷你服务器 4. 使用二进制文件上传和命令执行功能 5. 发送关闭请求,清理目标服务器残留文件 阅读全文 »