花式栈溢出 CTFshowpwn88

花式栈溢出

在这之前确实对这方面了解很少,一般这种花式栈溢出不仅仅要求你能发现漏洞,最主要的是你要有随机应变的能力

这个题是一个64位的题目看一下保护

canary 和 nx保护都开了,我们用ida打开看一下

那么程序主要是要你给一个地址和一个值,他会把你给的值放入你给的地址里面,然后就没了,看起来只能改一个地址的一个字节的数据,那么怎么办呢而且程序只运行一次,我们肯定需要多次修改地址的值

这里我的思路是程序结尾的时候有一个jnz跳转,既然我们只能写一个字节,那么我们能不能让这个跳转指令跳转到前面的代码继续执任意地址行可读呢,答案是可以的

首先要知道jnz有两段机器码,第一段就代表它本身,第二段代表它要跳转到地址的机器码

我们计算一下到我们想要的地址是多少0x400767 - 0x40071D = 0x4a,那么我们就可以这样来生成对应的机器码u32(asm("jnz $-0x4a")[1:].ljust(4,b'\x00'))

$代表当前地址,后面为什么是[1:]呢?因为我前面说了有两段机器码,第二个是对应地址的,所以我们取[1:] 而不是 [0:1],这样我们就可以跳转到前面的地址了

可以看见又执行了一次,那么为了保险起见我们把第一个机器码改成jmp,万一它那一次突然跳转另一个地方了呢?哈哈,不过后来我实验了一下不改也是可以的,这里我们

还是进行修改,u32(asm("jmp $-0x4a")[0:1].ljust(4,b'\x00')),这里取第一机器码

那么接下来我们只需要修改栈上的数据为我们的shellcod然后再跳转到我们输入的shellcode就好啦,不过要注意偏移,exp如下