24-01-01

本周学习总结

已经在堆里面与世长辞……

全局常量声明:新手上路,文章内容仅是由教程观点和自己总结获得,仅供参考。

一、计算机常识–大端小端

来一份简单的小图,一切清晰明了:

| 一般来说,程序会使用小端存储数据,而在网络传输中,会用大端传输数据。 |

我们一般所理解的字符串比如“deadbeef”在内存中的实际是用(高地址)←“deadbeef\0”→(低地址)这样的方式存储的,当程序是小端存储时,我们使用栈溢出覆盖内存单元也是从低地址到高地址覆盖的,我们可以特意控制将字符串末尾的\0覆盖掉,导致输出时不该输出的关键信息被输出。(然而用处好像并没有想像的那么大…)

二、Pwn手法–canary绕过

这是canary绕过手法之一,使用前需学习前置技能字符串格式化漏洞

canary是栈保护机制之一,通过在栈末尾(rbp(ebp)前)插入一段固定大小的数据来防止rip(eip)被篡改,因为要覆盖rip(eip)一定要经过这段固定数据。

| C#include <stdio.h>int main(){ char a[20]; gets(a); printf(a); //这里本应写成printf(“%s”,a); return 0;} |

我们可以使用大量的’%p’来泄漏栈上的地址,正常来说可以通过gdb调试来获得程序运行到这里时的栈上的地址,如果你在rbp(ebp)附近发现了以00结尾的16进制数据如:0x11451400,那么这个大概率就是canary的值。

三、easy题目–x64

下载附件获得程序文件x64

checksec一下:

什么都不开,不把我放在眼里是吧。

ida,启动!

512字节缓冲区,完全够用。

发现后门函数,但是没有”/bin/sh“?

发现”/bin/sh”。

经典retlibc手法。但是这是x64的程序,我们可以略微跳一下。

指令是后门函数的汇编代码,我们看见他通过call调用的system指令,我们也许可以直接将下一条指令设置为这里,因为是x64程序,我们只需要保证在执行system调用时保证rdi的值是”/bin/sh”的地址就可以了。

这时候就需要万能的ROP链出场。

发现符合条件的ROP:0x4007e3

构造脚本如下:

成功获取flag。

四、easy题目–Choice

下载后获得程序文件Choice。

checkesc如下:

64位程序,NX保护开启。

ida,启动!

首先输入一个数字决定运行Data1或Data2或Data3.

Data1函数溢出不足。

Data2函数溢出不足。

Data3内发现充足溢出。

发现后门函数,内含system,有完整的”/bin/sh”。

编写脚本,先输入3,在溢出跳转system执行地址,脚本如下:

发现flag。

下周学习计划

| 应该要做的事情 |

看完入门视频

开始真正进入题海

学习感受

于堆中长眠…


24-01-01
https://zlsf-zl.github.io/2024/01/01/11-611-12/
作者
ZLSF
发布于
2024年1月1日
许可协议