PWN Flashcards
PEB是什么
进程环境块
PEB是存放着进程信息的结构体
怎样才能找到PEB
线程TEB结构体中,偏移0x30(fs:[0x30])所指就是PEB
如何用Windbg查看PEB结构
nt!_PEB
TEB是什么
线程环境块,
每一个线程都有自己的TEB,
每个TEB都有自己的TIB(Thread Information Block),即线程信息块
TEB结构有什么特点
- 一个进程中可能同时存在多个线程
- 每个线程都有一个线程环境块
- 第一个TEB开始于地址0x7FFDE000(WIN10看寄存器窗口EFLAGS的S标志位后面的FS:[0]地址如:2ff000,去OD中dd 2ff000)
- 之后新建线程的TEB将紧随前边的TEB,之间相隔0x1000字节,并相内存低地址方向增长
- 当线程退出时,对应TEB也被销毁,腾出的TEB空间可被新建的线程重复使用
说说TIB结构都有什么
TTEB的0x0-0x18这段指针都是TIB FS:[000] 指向SEH链指针 FS:[004] 线程堆栈顶部 FS:[008] 线程堆栈底部 FS:[00C] SubSystemTib FS:[010] FiberData FS:[014] ArbitraryUserPointer FS:[018] 指向TEB自身
Inter与AT&T汇编区别举例:
操作方向相反
Intel:mov 目标 源
mov eax, 51h
AT&T:mov 源 目标
movl $51h, %eax
Inter与AT&T汇编区别举例:
指令前缀
Intel:没有这方面的要求
mov eax, 51h
AT&T:寄存器前边要加上%,立即数前要加上$
movl $51h, %eax
Inter与AT&T汇编区别举例:
内存单元操作数
Intel:基地址使用[]
mov eax,[ebx]
AT&T: 基地址使用()
movl (%ebx),%eax
Inter与AT&T汇编区别举例:
操作码后缀
Intel在[ ]时需要在操作数前面加dword ptr, word ptr, byte ptr的格式
Intel:mov al,bl
AT&T中操作码后面有一个后缀字母:“l” 32位,“w” 16位,“b” 8位
AT&T:movb %bl %al
Inter与AT&T汇编区别举例:
跳转后缀(f,b)
AT&T中跳转指令标号后的后缀 表示跳转方向
“f”表示向前,“b”表示向后
Inter与AT&T汇编区别举例:
注释符号不同
AT&T: #
Inter: ;
jmp esp机器码是多少
ff e4
retn机器码是多少
c3
retn 8后,eip和esp分别怎么变化
EIP=esp,esp=esp+4+8
从网上找到的shellcode怎样试验能不能用?
方法1:
采用注入的思想:
使用temp\教程\在学\小工具\代码注入器
把汇编代码写在里面,随便找一个进程双击,然后点注入远程代码
方法2:
直接od随便找个程序,把上面代码贴到里面,第一条shellcode指令右键,“设为eip”
然后运行。
简述栈溢出覆盖返回地址流程
0、崩溃重现(搞一特别长串字符使其崩溃) 1、找个jmp esp(!mona find -s 0xe4ff) 2、生成pattern串(!mona pc 30000) 3、找EIP偏移(!mona findmsp)并替换成jmp esp地址 4、msf生成shellcode 5、填充字符(大小24)+jmp esp的地址(大小4,注意小端)+ 20个0x90 +shellcode
什么是软件DEP
软件DEP就是SafeSEH,在调用异常处理函数之前,对调用的异常处理函数进行校验,如果发现异常处理函数不可靠(被覆盖,被篡改),则立即终止异常处理函数的调用
什么是硬件DEP
会把需要保护的页面设置成不可执行页(把堆栈设置为不可执行属性),防止shellcode在堆栈中执行。
windows中怎样通过rop绕过DEP
1、使用!mona pc 30000溢出,记下EIP的偏移 2、找小配件(!mona rop -m *.dll -cp nonull ) 3、去rop_chains找一个rop链 构造: "A"*26081 + ROP + shellcode
windows中利用SEH原理是什么
[填充字符] [nextSEH] [Handler] [Nop-Shellcode]
nextSEH = 跳转到Shellcode的指令码 Handler = pop,pop,ret指针
windows中利用SEH流程是什么
1、触发异常(!mona pattern_create 20000) 2、搜索pop pop ret指针(!mona seh ) 3、运行程序,程序崩溃会断下 !mona findmsp查看SEH链,发现handler位于612偏移处, SEH前面就是next SEH指针,因此填充字符长度为612-4=608
构造
[608个填充字符] [\xEB\x06\x90\x90 ] [pop,pop,ret指针] [Nop+Shellcode]
windows中GS保护机制是什么
当编译的时候,如果开启GS选项,则会在函数的开头和结尾添加代码来阻止典型栈溢出(字符串缓冲区)的利用。
当程序启动后时,会随机一个4字节的cookie保存在.data节中,在函数开始时cookie被拷贝到EBP和返回地址的正前方。
windows中ALSR是什么
每次重启会发现模块的基地址都是变化的,就是ASLR造成的。
一个由C/C++编译的程序占用的内存分哪几个部分
栈区(stack) 堆区(heap) 静态区 文字常量区 代码区
解释函数: HeapAlloc HeapCreate HeapDestroy HeapFree
HeapAlloc:在堆中申请内存空间
HeapCreate:创建一个新的堆对象
HeapDestroy:销毁一个堆对象
HeapFree:释放申请的内存
解释函数: HeapWalk GetProcessHeap GetProcessHeaps LocalAlloc GlobalAlloc
HeapWalk:枚举堆对象的所有内存块 GetProcessHeap :取得进程的默认堆对象 GetProcessHeaps:取得进程所有的堆对象 LocalAlloc :从堆分配内存 GlobalAlloc :从堆分配内存
回忆一下一个堆区里面都有啥
堆区里面的开头有一个堆表,后面有很多个堆块,堆块里面有块首和块身
一个堆单位是多少个字节
8个字节
堆块的分配过程——
快表分配过程:
- 寻找大小匹配的空闲堆块
- 将其状态改为占用
- 把它从堆表中卸下
- 返回堆块指针给程序使用
堆块的分配过程——
普通空表分配过程:
1、寻找最优空闲块分配
2、若失败,寻找次优空闲块分配(即最小的能满足要求的空闲块)
堆块的分配过程——
零号空表分配过程:
1、零号空表中按照大小升序,所以分配时先看最后的块看看能不能满足(最大的都不满足,那就拉JB倒了)
2、如果能满足,再正向从小到大搜索最优/次优的空闲块。
堆块的分配时,
空表的‘找零钱’是啥意思
当发生次优解时,会先从大块中精确地割出一块来分配,剩下的部分重新标注块首,链入空表。(找零钱,绝不玩大方)
堆块的释放过程是怎样的
说白了就是将堆块链入空表
1、堆块状态改为空闲
2、链入堆表末尾,再分配时也是先从末尾拿
堆块合并过程是怎样的
反复申请与释放,堆区有很多碎片,系统发现两个空闲堆块彼此相邻时,就会合并 1、将两个堆块从空表卸下 2、合并 3、调整合并块的块首信息(如大小等) 4、将新块链入空表
Egg Hunter原理
有时候可用的内存放不下shellcode,这时候需要先使用一小段代码(寻蛋代码),通过这小段代码找到真正的shellcode。这技术叫寻蛋技术
Egg Hunter流程
- !mona pc 2000 用这段字符使程序崩溃
- !mona findmsp 找到EIP偏移
- 构造Stage1
【515*‘A’】 #这里面放寻蛋指令
【jmp esp地址】 #注意:不能是坏字符
【jmp \xEB】 #跳转到寻蛋指令 - !mona egg –t b33f 生成寻蛋指令,这条指令32个字节,515-32=483
- 构造Stage1:
【478个nop】
【寻蛋指令】
【5个nop】
【jmp esp地址】
【jmp eb指令】 向上跳60字节,32+5<60,所以是可以的 - 查看该程序应该还有其他参数可以写进内存,比如说‘User-Agent’,把这个参数值使用:
【’b33fb33f’】
【shellcode】
怎样获得api函数地址
插件-常用api下断点-查看断点地址
Windbg:
查看反汇编代码怎么看
u 地址
Windbg:
查看数据结构
nt
nt!_PEB
Windbg:
继续执行
g
Windbg:
查看eax寄存器
reax
Windbg:
显示所有加载模块
lm
Windbg:
显示模块DSPrivateData64详细信息
显示指定模块的详细信息