pwnable.tw新手向write up(一)
pwnable.tw新手向write up(二) 3×17-x64静态编译程序的fini_array劫持
看一下防护,全开了
IDA看一下程序结构,其实简单的很.大体就是一个输入几个数字然后冒泡排序并打印.以下为溢出点:
读取名字的时候并没有进行截断,会造成信息泄露.其次在数字的数量上并没有限制,又因为数字是保存在栈上的,所以我们获得了栈溢出.
利用方法
用gdb断在输出姓名那一行代码上,观察栈的构造,看有没有重要信息可供泄露.
我们可以看到栈的下方偏移为6的地方存有GOT表,我们可以泄露这个地址,然后获得libc加载的基地址.接着readelf获得libc.so文件中got的偏移(省略了无关信息)
现在只要我们泄露GOT的地址,再减去偏移地址0x001b0000,就得到了libc.so文件的加载地址.
得到libc基地址就可以计算出system函数以及'/bin/sh'字符串所在的地址,现在目标地址以及有了,只需要控制eip就可以了.这个溢出也很简单,只要用scanf覆盖返回地址就可以了,但这个题最难搞定的点就在这里,他开了Canary检测,如果我们想要覆盖返回地址,那就会覆盖Canary,导致溢出失败,所以要先想办法解决Canary.
我最先想到的是非法输入,scanf读取的是一个%u,我们随便输一个字符,但是读取数字的这个循环只对stdout进行了清空,而没有对输入进行清空,所以这个非法输入会导致后面的输入也全都无效,自然不能覆盖返回地址.
那有没有一个既合法又不会改变数值的输入呢?有,那就是'+'和'-'.这两个符号可以定义正负,所以会被识别为合法输入,但是仅凭一个加号或者减号scanf又无法获得有效数值,所以这次输入是"合法且无效的",正好满足我们对Canary所在地址的操作.和非法输入不同的是,上一次无效的scanf并不会影响接下来的scanf,scanf识别不到有效数据的话会继续中断等待我们的输入.这样,我们可以肆意修改栈上的数据,只要在Canary地址处输入一个'+'来跳过他.
现在所有需要的东西都已经具备了,可以开始构建我们的payload了.
先看一下程序开头那一堆变量:
number_buf就是我们保存输入数字的地方,而canary的相对偏移为0x60,canary相对返回地址的偏移为0x1c.返回地址之后我们还需要再填充一个返回地址(随便写)和'/bin/sh'的地址作为参数.
exp
关于我
博客有我的联系方式,欢迎大家来玩,地址:https://www.0x2l.cn
[0] % checksec dubblesort
[*] '/home/dylan/desktop/pwnable_tw/dubblesort/dubblesort'
Arch: i386-32-little
RELRO: Full RELRO
Stack: Canary found
NX: NX enabled
PIE: PIE enabled
FORTIFY: Enabled
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2020-8-12 20:23
被0x2l编辑
,原因: 修改