信息安全CTF--二进制方向学习记录(第一周)

信息安全CTF–二进制方向学习记录(第一周)

    新手一枚,如有错误(不足)请指正,谢谢!!
本周主要学习内容:
  • PWN方向栈溢出漏洞学习与实践(补写记录)
  • PWN方向格式化字符串漏洞的学习与实践
  • 基本RE题目的练习

一.栈溢出漏洞学习笔记

基本栈介绍(参考资料CTF-Wiki )
栈是一种典型的后进先出 (Last in First Out) 的数据结构,其操作主要有压栈 (push) 与出栈 (pop) 两种操作,如下图所示(维基百科)。两种操作都操作栈顶,当然,它也有栈底。

高级语言在运行时都会被转换为汇编程序,在汇编程序运行过程中,充分利用了这一数据结构。每个程序在运行时都有虚拟地址空间,其中某一部分就是该程序对应的栈,用于保存函数调用信息和局部变量。此外,常见的操作也是压栈与出栈。需要注意的是,程序的栈是从进程地址空间的高地址向低地址增长的。
信息安全CTF--二进制方向学习记录(第一周)_第1张图片
而基本的栈溢出漏洞就是利用程序输入没有限制,对程序加以超出规定大小的输入,从而达到对重要信息的替换,重写和劫持。而在分析程序的时候我们主要采用IDA进行静态分析,分析个个栈内的情况。对于不同的64位与32位程序有这不同的利用方法和不同的寄存器存储方式。

  • 32位
    信息安全CTF--二进制方向学习记录(第一周)_第2张图片
    栈溢出基本思路是覆盖掉返回地址和参数,执行system()函数从而/bin/sh拿到flag
  • 64位
    64位的栈帧也是这样的
    但是在 Linux 上,前六个参数通过 RDI 、 RSI 、 RDX 、 RCX 、 R8 和 R9 传递;
    而在 Windows 中,前四个参数通过 RCX 、 RDX 、 R8 和 R9 来传递
    而第七个(windows下第五个)参数才push进参数的地方。
    所以在对payload进行构造的时候要采用不同的构造方式。
    信息安全CTF--二进制方向学习记录(第一周)_第3张图片

一道简单的例题(warmup_csaw_2016)

信息安全CTF--二进制方向学习记录(第一周)_第4张图片
分析程序,程序是64位的程序,并且存在system的后门,所以我们要利用输入不设限制构造栈溢出,让程序执行到system所在的函数,从而达到最终目的。
信息安全CTF--二进制方向学习记录(第一周)_第5张图片

二.格式化字符串漏洞

这个板块我看了很久,并且结合了很多大佬的博客题解和讲解才搞得一知半解,还没有完全自己做出来过题目,但是也略有收获,先将这些记下来,之后再继续完善这方面的知识。
先附上一张解释十分到位的图:
信息安全CTF--二进制方向学习记录(第一周)_第6张图片
这张图就十分的清楚的向我们解释了格式化字符串漏洞的原理,printf在实现打印操作时,其实是将一个栈中的数据进行解析并且进行输出。在进入 printf 之后,函数首先获取第一个参数,在这幅图中第一个参数是“Color %s…”这一个完整的字符串。之后进行解析,每当遇到%这种字符串时,printf函数就会在整个栈中去寻找对应的解析参数,在这个例子中,%s对应的解析参数就是red,以此类推。
于是有意思的事情就发生了,在题目没有做任何限定和参数的限制时,我们可以注入%p,%s等输入,使函数错认为输入为格式化的字符,从而在栈中读取我们想要的地址,信息等。当然也可以对数据进行修改,但是这个地方我还没有很熟练,还需要练习,这里的例题,具体的解题技巧,留给下次再写。。。。。

三.一道有趣的re题目。

有一说一,最近在刷题得时候,也就这道re题目给了我眼前一亮的感觉。主要是因为水平原因,基本的re加密题,大多数就是算法的分析,而对与比较难的re题,因为动态调试的水平不佳,往往是毫无思路,或者是被大规模的代码劝退。在re学习的方向上下一步大打算是学习脱壳技巧,看看能不能完成,掌握手动脱壳。。。

[2019红帽杯]easyRE

IDA64位载入,string视图查找有用信息,找到main函数,反编译发现两个输入input,开始逐个进行常规分析,十分的简单不过多赘述。在第一个input分析完成后,发现是一句提示得知前四个字符是flag。反复调用了sub_400E44()函数,查看后发现是base64加密,也就是进行了十次base64加密查看原加密函数串

Vm0wd2VHUXhTWGhpUm1SWVYwZDRWVll3Wkc5WFJsbDNXa1pPVlUxV2NIcFhhMk0xVmpKS1NHVkdXbFpOYmtKVVZtcEtTMUl5VGtsaVJtUk9ZV3hhZVZadGVHdFRNVTVYVW01T2FGSnRVbGhhVjNoaFZWWmtWMXBFVWxSTmJFcElWbTAxVDJGV1NuTlhia0pXWWxob1dGUnJXbXRXTVZaeVdrWm9hVlpyV1hwV1IzaGhXVmRHVjFOdVVsWmlhMHBZV1ZSR1lWZEdVbFZTYlhSWFRWWndNRlZ0TVc5VWJGcFZWbXR3VjJKSFVYZFdha1pXWlZaT2NtRkhhRk5pVjJoWVYxZDBhMVV3TlhOalJscFlZbGhTY1ZsclduZGxiR1J5VmxSR1ZXSlZjRWhaTUZKaFZqSktWVkZZYUZkV1JWcFlWV3BHYTFkWFRrZFRiV3hvVFVoQ1dsWXhaRFJpTWtsM1RVaG9hbEpYYUhOVmJUVkRZekZhY1ZKcmRGTk5Wa3A2VjJ0U1ExWlhTbFpqUldoYVRVWndkbFpxUmtwbGJVWklZVVprYUdFeGNHOVhXSEJIWkRGS2RGSnJhR2hTYXpWdlZGVm9RMlJzV25STldHUlZUVlpXTlZadE5VOVdiVXBJVld4c1dtSllUWGhXTUZwell6RmFkRkpzVWxOaVNFSktWa1phVTFFeFduUlRhMlJxVWxad1YxWnRlRXRXTVZaSFVsUnNVVlZVTURrPQ==

进行解密后发现一个网址,https://bbs.pediy.com/thread-254172.htm。嗯上当了,我还慢慢的把文章读了一遍,得出了一个结论,出题的心都脏(狗头)。
于是问题来了,flag到底在什么地方呢,参考了一下题解发现以一个.fini段的调用。
信息安全CTF--二进制方向学习记录(第一周)_第7张图片
此节区包含了可执行的指令,是进程终止代码的一部分。程序正常退出时,系统将安排执行这里的代码。
所以在此段中找到关键的加密代码进行解码即可。

你可能感兴趣的:(ctf,二进制)