- [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覆盖。
- pwn2_sctf_2016的32位
payload='a'*(0x2c+4)+p32(printf_plt)+p32(main)+p32(printf_got)
对这句的理解:为什么p32(main)能够成功?
payload被覆盖至栈中后,等于是给栈进行了状态化,也就是此时是一个就绪态,覆盖过程可以看作执行函数前该函数的参数传递的过程,传递完成后,只等执行。后续程序执行只会利用栈,辅助指令执行,而不是取修改栈,所以如此。
- pwn2_sctf_2016的64
寄存器传参数中printf函数的调用,构造两个参数:一个字符串,一个地址,关键是字符串:含有**%s**可以让read_got地址处的数值以字符的形式被输出。