ICQ Baidu December Pwn



what_the_fuck

题目开启了NX与Canary
题目中在sub_4008C5存在一个format string,并且read时可以越界写到Canary,触发__stack_chk_fail。

首先需要劫持控制流,利用printf任意地址写,但是在printf函数中,程序结束….一开始想到写.fini段,但是发现不可行
于是,结合read可写Canry,我们可改写__stack_chk_fail的GOT表地址为main函数地址,每次改写Canary触发check现程序循环运行
这样我们可无限利用fromat-string进行任意读写

依旧是题目没有提供libc,并且泄露lbc version不可行,只能利用ret2syscall
需要在栈中利用 Init 中的通用RopGadgets布置RopChain

由于栈空间不断向下增长,而当sub_4008C5中不再触发check时,则会逐层返回
所以我们就利用无限写的能力在栈上布置Ropchain
在该过程中,充分利用我们可控的栈空间,即输入的$s与输入的&name,其余不可控的栈空间,我们利用format string布置即可
最终栈中的效果如下图:

  1. 泄露read地址,确定syscall地址
  2. 通过read(0,&bss,0x3b)将”/bin/sh”与syscall地址写入.bss段
  3. 通过syscall并利用read的返回值0x3b,执行execve(“/bin/sh\x00”,NULL,NULL)

breakinggdb

题目中存在一个整形溢出

如上图,当v2+17>0xffff,则绕过if ( (unsigned __int16)(v2 + 17) > 0x200u )的判断,从而造成overflow函数中发生溢出。

同样在进行漏洞利用时,原本我们利用rop就能够直接泄露地址云云,但是题目没有给libc,而我们测试的libc地址又在各大libc网站中无从找到,所以这里我们采用的依旧是ret2syscall
期望令rax=11,rbx=“/bin/sh”,rcx=0,rdx=0,执行int80h Getshell
但是在实际中可利用的gadgets比较少,所以下面的这种方式利用了stack_pivot来劫持栈,进行实现rop
通过read(0,&bss,0xb)使得eax=0
通过
该Gadgets构造edx=0
最后通过mov ecx, dword ptr [ebp – 4] ; leave ; lea esp, dword ptr [ecx – 4] ; ret
stack_pivot构造使得ecx=&addr->NULL
最后调用int80h Getshell

EasyPwn

题目中存在一个明显的栈溢出漏洞,buf数组越界……

但是开启了Canary
首先通过第一个read(&buf,0,0×40)覆盖Canary的最后一个字节”\x00″,从而将Canary泄露出来。
在之后填入泄露的Canary做ROP
同样题目中泄露是会出现问题的,所以还是选择做ret2syscall,通过read函数泄露syscall地址,进而利用通用gadgets调用执行
execve(“/bin/sh”,NULL,NULL)

发表评论