美文网首页
复现笔记|篡改栈上指针,泄漏堆地址

复现笔记|篡改栈上指针,泄漏堆地址

作者: zzzc2077 | 来源:发表于2018-04-14 15:11 被阅读0次

实验环境:ubuntu 64位 16.04
实验工具:pwntools,gdb-peda,IDA
实验程序ELF来源:强网杯2018-opm

程序运行界面菜单:


image.png

第一个功能Add a new role有问题。IDA反编译查看。


image.png

分析以上代码,经过分析发现,v6是一个heap指针,且当执行"gets(&v5)"时,有可能会被溢出修改。但因为时"gets()"函数修改,你输入的字符串后加上“\x00”,效果看下图,查看栈空间。


1523671146(1).jpg
溢出篡改v6
1523672191(1).jpg

这就导致了我们要特别关注heap_address为0x00005xxxxxxxxx00之类的地址,比如下图:


1523672779(1).jpg

接下来 我们分析一下它的heap分配情况,根据IDA反编译的结果显示,一个add功能进行了两次heap分配。
v0 = (_QWORD *)operator new(32LL);
and
v7 = (char )malloc(v2);
从内存查看的数据结果来看,operator new()和malloc()申请heap,没差别(应该会有差别的,这里不讨论)。如下图,添加一个name为‘A’
0x70的role。1 punch。

1523674136(1).jpg

接下来进行篡改指针(v6)覆盖heap数据的测试,上提及:
0x555555768c00
0x555555768d00
0x555555768e00
0x555555768f00
之类的heap地址是危险的地址,方便控制的。0x555555768c00已经被系统利用了,我们控制不了。于是我们选择攻击
0x555555768d00。首先0x30个‘B’打在0x555555768d00。

1523677056.jpg
然后创建第三个role的篡改指针(v6),使name3__addr,打在0x555555768d00附近。如下图。原本应该在0x555555768d40的数据被打在了0x555555768d00附近。
1523678199(1).jpg
那么接下来就要想想该怎么进行泄漏了。
在add a new role这个函数下,它有一个输出函数,用于输出role的name和punch数。而它的参数是v6,是可以被控制的。如果我们这时我们想要泄漏出0x555555768d00的数据,则需要将原本v6(此时指向0x555555768d40)让他指向0x555555768cd0。如下图。但是上面提到过"gets()"溢出并没有那么容易控制,想要修个v6指向0x555555768cd0是不可能的,并且程序开启了PIE(基地址随机化)。
1523685095(1).jpg
这里想到了办法是,将0x555555768cd0上的数据保存到一个可控的地址上去,这再添加第二个role,输入name的时候可以做到。然后在添加第三个role的时,输入name的时候溢出,将地址打在
0x555555768d00上。在输入punch的时候将v6指向有
“0x555555768d00”的地址上。
下面演示一遍,:
添加第一个role ,name为"A"0x70,punch为1,这里输入0x70个‘A’是为了第二个role的name_addr在0x555555768d00上。
image.png
添加第二个role,name为"B"0x80 + "a" ,punch为2。这个为了修改v6使原本应该保存在0x555555768cd0 的数据保存在一个可控的地方。
输入完name之后,查看栈的数据。看到v6已经被修改为:0x0000555555760061
1523686827(1).jpg
然后让程序执行几步后查看堆内存,0x555555768cd0,数据没了 1523687013(1).jpg
然后查看0x0000555555760061,数据在这里
1523687134(1).jpg
添加第三个role,name为"C"
0x80,punch为"2"+"C"*0x7f+"a"。
输入name是为了修改v6,让heap地址打在0x555555768d00如下图。
此时的v6
image.png
此时的0x555555768d00:
1523687559(1).jpg
输入punch ,最前面有一个2是为了过atoi()这个函数。
此时的v6,指向了我们前边提到的可控的地址。0x0000555555760061。过几步,v6会作为输出函数的参数。
image.png
成功泄漏:
image.png

使用pwntools,脚本如下。

image.png

相关文章

  • 复现笔记|篡改栈上指针,泄漏堆地址

    实验环境:ubuntu 64位 16.04实验工具:pwntools,gdb-peda,IDA实验程序ELF来源:...

  • GeekBand oc课程笔记

    oc课程笔记 堆和栈的区别 指针是存放在“栈”上,而对象时存放在“堆”上的,访问对象职能通过指针的方式来访问。 栈...

  • [C++之旅] 16 对象指针/对象成员指针/this指针

    [C++之旅] 16 对象指针/对象成员指针/this指针 一、对象指针 对象指针指向堆中地址 对象指针指向栈中地...

  • 栈溢出

    栈中压入数据栈顶指针地址变小 pop数据栈顶指针地址变大 也就是说栈底指针地址大于栈顶地址 EIP:扩展指令指针。...

  • NULL、Nil和NSNull的区别

    NULL 空地址,空指针 ,C语言 nil 空对象 栈上开辟空间 指向内存为 0 的堆地址 OC语言 本质...

  • 十个关于指针的一些问题解答(面试必备)

    一、堆和栈上的指针 1.指针所指向的这块内存是在哪里分配的,在堆上称为堆上的指针,在栈上为栈上的指针. 2.在堆上...

  • 内存泄漏理解

    1.简单理解 内存泄漏指的是堆内存泄漏,栈不会发生内存泄漏,只会发生栈溢出(StackOverFlow)。简单一个...

  • js 对象深拷贝与浅拷贝

    js基本数据类型与对象指针(引用地址)存放在栈内存,对象实际存放在堆内存。变量标志符和值(基本数据和指针)保存在栈...

  • Effective Objective-C

    一、对象所占的内存总是分配在堆空间中,绝对不会分配在栈上。 someString 是一个指针,它的值是个内存地址,...

  • Go 语言学习笔记-指针、切片与结构体

    指针 指针就是地址。指针变量就是存储地址的变量 指针使用 &p : 引用*p : 解引用、间接引用 栈帧 用来给函...

网友评论

      本文标题:复现笔记|篡改栈上指针,泄漏堆地址

      本文链接:https://www.haomeiwen.com/subject/kmbkkftx.html