type
status
date
slug
summary
tags
category
icon
password
nc
发现进行了
stdout
和stderror
的修改,直接进行exec 1>&0 虽然是写到了标准输入,但是标准输入也是可以当成一种回显,没有问题nc2
得到本地文件,通过对其进行分析,直接用
gdb
对其进行动态调试,按照提示的做法,对syscall
进行跟踪,就能得到payload新五子棋
这个五子棋可以通过对它的棋盘边界之外的地方进行调用,当user进行下棋的时候会将内存中值为-1的内存处的值变为0
同时,对于胜利的逻辑而言:这个
dword_4020
和dword_4040
数组,可以看出其中是有-1的,也就是说我们通过这个地方,进行将-1的数组值变为0,这样就能够直接将其胜利逻辑进行修改,变为0,这样的话逻辑就变为了:对于其
dword_4020
和dword_4040
同时为0的值的时候,如果棋盘中有一个地方值为0,那么就会连续5次对其进行判断通过,结果就是胜利,这样的话就满足的拿到flag的后门条件fmt
这个题我觉得有点怪,不知道为什么不能用
ogg
,我试着用ogg
做了一个白天,但是总是会报各种各样的问题。(不过在这个题中我才反应过来原来read函数如果没有输入满的话,是会一直等待输入的,所以他们封装了一个外部的函数,这样回车就可以被当作结束符了)
这个题目主要考察的就对于如何多次使用
fmt
的做法,答案也比较经典:就是构造循环我们可以发现在栈末尾是有着一个指针的,这个指针所处位置正好就是栈中的一个地址
对这个位置进行修改,将其最后一位覆盖掉,就可以进行相当于修改其指针指向,如果将它修改到指向返回地址的位置,我们就可以进行相应的操作了,也就是把返回地址修改了
接着就是进入了第二、三次的修改
第二次修改和第三次修改因为直接使用了栈迁移,将rbp的值迁移为了前面我们输入的字符串的地址,同时因为fmt退出后main函数还退出,所以有两个leave指令,制作栈迁移即可
ret2dl
考察了ret2dl,这个题可以看作一个模板题,就是调试就行了,其中涉及了不少栈迁移的内容
blind2(可学习ret2csu和无限栈移)
这个题是是看了wp,它用了很多栈迁移,如果对栈迁移不熟悉的话,看着就会很头痛(比如我)
首先总结一下leave指令,这个指令的结果:
rbp
变成了rbp
指向的内容,rsp
变成了旧rbp+0x8
(64位下),也就是说rbp
进化了,然后rsp
拿了旧的rbp
部分上加一位栈地址。然后我们看看这个wp:
首先给出exp:
有一部分有注释了,但是还要总结一下,不然太乱了
ret2csu
这个模板虽然和我那个不一样,但是看着更加的清晰,ret2csu就是通过这个init函数,先从
0x4006CA
走,然后走0x4006B0
。目的其实就是call一个函数,这个函数地址是call参数地址,然后rbp
寄存器变成rbp
参数值。这个rbp如果用来做栈迁移就很方便了。
exp解释
这里对返回值进行利用,返回到了这个位置
通过修改rbp达成任意写的效果。
修改bss中的一个read函数,这个函数是这样的
最后两个字节被填充了,很怪,这是出题人的问题,他将这道题设置成了read_got在bss中,导致我们直接用一次leave指令就将rsp变成了read_got+8的地址,这个地址是我们自己的输入地址。
然后进行
ret2csu
我们可以发现将
ret2csu
和栈迁移一起使用可以达到任意栈地址迁移,使用ret2csu
可以更新rbp,然后和leave指令一起,无限栈迁移将read_got的地址改两个字节改成
\xd0
,这样就可以使用read函数+0x10的地址,这是个syscall
,后面可以通过这个syscall
和ret2csu来进行任意函数的实现。同时可以看出来,对于下面这种构造链, 并没有执行完所有输入的链。在执行到
p64(gadget)
的时候,就通过gadget
在main函数中这一特殊,直接用栈迁移去到了csu中的rbp所在位置通过对syscall,来模拟write函数,来进行泄露libc,再进行