pwn2_sctf_2016的32位和64位、[ZJCTF 2019]EasyHeap 的收获

  1. [ZJCTF 2019]EasyHeap

堆菜鸡题后简 结,见谅

查看保护机制

Arch: amd64-64-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x400000)

本题的思路就是
控制heaparray附近的区域,覆盖heaparray[0]处为free_got的地址,使之被作为chunk看待,edit覆盖free_got地址为system_plt地址,而后利用delete中的free以
**(&heaparray + idx)**为参数,将参数内容写位"/bin/sh\x00",再次调用delete即可。

这里的堆指针是被放在heaparray数组中的,而IDA中查看可知,这个数组被放在.bss段,
而且还有system函数,那么不用泄露libc基地之了。分析IDA中的汇编代码知道:delete函数调用的free函数将
(&heaparray + idx)
作为参数意思是如果这个是"/bin/sh\x00"的话正好。
很明确了,我们可以先申请一个fastbin将其释放,而后利用其上一个的edit功能覆写其fd指向相对heaparray[0]低地址处的空间,为了成功绕过检查必须使大小相同。

关键体验是:利用fastbin攻击,虽然无法double free,但是这里先释放一个fastbin而后利用物理相邻低地址处的chunk,对其进行覆盖溢出,修改其fd,fd指向的地方被当作chunk,这个chunk大小要和被释放的chunk一致,两次申请得到fd指向chunk的地址,就是控制权。这里要修改free_got地址倒是比较方便,可以将其放入heaparray[0]处,使free_got地址被当作chunk,而后直接edit覆盖。

  1. pwn2_sctf_2016的32位
payload='a'*(0x2c+4)+p32(printf_plt)+p32(main)+p32(printf_got)

对这句的理解:为什么p32(main)能够成功?
payload被覆盖至栈中后,等于是给栈进行了状态化,也就是此时是一个就绪态,覆盖过程可以看作执行函数前该函数的参数传递的过程,传递完成后,只等执行。后续程序执行只会利用栈,辅助指令执行,而不是取修改栈,所以如此。

  1. pwn2_sctf_2016的64

寄存器传参数中printf函数的调用,构造两个参数:一个字符串,一个地址,关键是字符串:含有**%s**可以让read_got地址处的数值以字符的形式被输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值