PWN Flashcards

1
Q

PEB是什么

A

进程环境块

PEB是存放着进程信息的结构体

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

怎样才能找到PEB

A

线程TEB结构体中,偏移0x30(fs:[0x30])所指就是PEB

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

如何用Windbg查看PEB结构

A

nt!_PEB

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

TEB是什么

A

线程环境块,
每一个线程都有自己的TEB,
每个TEB都有自己的TIB(Thread Information Block),即线程信息块

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

TEB结构有什么特点

A
  1. 一个进程中可能同时存在多个线程
    1. 每个线程都有一个线程环境块
    2. 第一个TEB开始于地址0x7FFDE000(WIN10看寄存器窗口EFLAGS的S标志位后面的FS:[0]地址如:2ff000,去OD中dd 2ff000)
    3. 之后新建线程的TEB将紧随前边的TEB,之间相隔0x1000字节,并相内存低地址方向增长
    4. 当线程退出时,对应TEB也被销毁,腾出的TEB空间可被新建的线程重复使用
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

说说TIB结构都有什么

A
TTEB的0x0-0x18这段指针都是TIB
FS:[000]   指向SEH链指针      
FS:[004]   线程堆栈顶部
FS:[008]   线程堆栈底部
FS:[00C]   SubSystemTib
FS:[010]   FiberData
FS:[014]   ArbitraryUserPointer
FS:[018]   指向TEB自身
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Inter与AT&T汇编区别举例:

操作方向相反

A

Intel:mov 目标 源
mov eax, 51h

AT&T:mov 源 目标
movl $51h, %eax

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Inter与AT&T汇编区别举例:

指令前缀

A

Intel:没有这方面的要求
mov eax, 51h

AT&T:寄存器前边要加上%,立即数前要加上$
movl $51h, %eax

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Inter与AT&T汇编区别举例:

内存单元操作数

A

Intel:基地址使用[]
mov eax,[ebx]

AT&T: 基地址使用()
movl (%ebx),%eax

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Inter与AT&T汇编区别举例:

操作码后缀

A

Intel在[ ]时需要在操作数前面加dword ptr, word ptr, byte ptr的格式
Intel:mov al,bl

AT&T中操作码后面有一个后缀字母:“l” 32位,“w” 16位,“b” 8位
AT&T:movb %bl %al

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Inter与AT&T汇编区别举例:

跳转后缀(f,b)

A

AT&T中跳转指令标号后的后缀 表示跳转方向

“f”表示向前,“b”表示向后

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Inter与AT&T汇编区别举例:

注释符号不同

A

AT&T: #

Inter: ;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

jmp esp机器码是多少

A

ff e4

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

retn机器码是多少

A

c3

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

retn 8后,eip和esp分别怎么变化

A

EIP=esp,esp=esp+4+8

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

从网上找到的shellcode怎样试验能不能用?

A

方法1:
采用注入的思想:
使用temp\教程\在学\小工具\代码注入器
把汇编代码写在里面,随便找一个进程双击,然后点注入远程代码

方法2:
直接od随便找个程序,把上面代码贴到里面,第一条shellcode指令右键,“设为eip”
然后运行。

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

简述栈溢出覆盖返回地址流程

A
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
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

什么是软件DEP

A

软件DEP就是SafeSEH,在调用异常处理函数之前,对调用的异常处理函数进行校验,如果发现异常处理函数不可靠(被覆盖,被篡改),则立即终止异常处理函数的调用

19
Q

什么是硬件DEP

A

会把需要保护的页面设置成不可执行页(把堆栈设置为不可执行属性),防止shellcode在堆栈中执行。

20
Q

windows中怎样通过rop绕过DEP

A
1、使用!mona pc 30000溢出,记下EIP的偏移
2、找小配件(!mona rop -m *.dll -cp nonull )
3、去rop_chains找一个rop链
构造:
"A"*26081 + ROP + shellcode
21
Q

windows中利用SEH原理是什么

A

[填充字符] [nextSEH] [Handler] [Nop-Shellcode]

nextSEH = 跳转到Shellcode的指令码
Handler = pop,pop,ret指针
22
Q

windows中利用SEH流程是什么

A
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]

23
Q

windows中GS保护机制是什么

A

当编译的时候,如果开启GS选项,则会在函数的开头和结尾添加代码来阻止典型栈溢出(字符串缓冲区)的利用。

当程序启动后时,会随机一个4字节的cookie保存在.data节中,在函数开始时cookie被拷贝到EBP和返回地址的正前方。

24
Q

windows中ALSR是什么

A

每次重启会发现模块的基地址都是变化的,就是ASLR造成的。

25
Q

一个由C/C++编译的程序占用的内存分哪几个部分

A
栈区(stack)
堆区(heap)
静态区
文字常量区
代码区
26
Q
解释函数:
HeapAlloc
HeapCreate
HeapDestroy
HeapFree
A

HeapAlloc:在堆中申请内存空间
HeapCreate:创建一个新的堆对象
HeapDestroy:销毁一个堆对象
HeapFree:释放申请的内存

27
Q
解释函数:
HeapWalk
GetProcessHeap 
GetProcessHeaps
LocalAlloc 
GlobalAlloc
A
HeapWalk:枚举堆对象的所有内存块
GetProcessHeap :取得进程的默认堆对象 
GetProcessHeaps:取得进程所有的堆对象 
LocalAlloc :从堆分配内存
GlobalAlloc :从堆分配内存
28
Q

回忆一下一个堆区里面都有啥

A

堆区里面的开头有一个堆表,后面有很多个堆块,堆块里面有块首和块身

29
Q

一个堆单位是多少个字节

A

8个字节

30
Q

堆块的分配过程——

快表分配过程:

A
  1. 寻找大小匹配的空闲堆块
    1. 将其状态改为占用
    2. 把它从堆表中卸下
    3. 返回堆块指针给程序使用
31
Q

堆块的分配过程——

普通空表分配过程:

A

1、寻找最优空闲块分配

2、若失败,寻找次优空闲块分配(即最小的能满足要求的空闲块)

32
Q

堆块的分配过程——

零号空表分配过程:

A

1、零号空表中按照大小升序,所以分配时先看最后的块看看能不能满足(最大的都不满足,那就拉JB倒了)

2、如果能满足,再正向从小到大搜索最优/次优的空闲块。

33
Q

堆块的分配时,

空表的‘找零钱’是啥意思

A

当发生次优解时,会先从大块中精确地割出一块来分配,剩下的部分重新标注块首,链入空表。(找零钱,绝不玩大方)

34
Q

堆块的释放过程是怎样的

A

说白了就是将堆块链入空表
1、堆块状态改为空闲
2、链入堆表末尾,再分配时也是先从末尾拿

35
Q

堆块合并过程是怎样的

A
反复申请与释放,堆区有很多碎片,系统发现两个空闲堆块彼此相邻时,就会合并
1、将两个堆块从空表卸下
2、合并
3、调整合并块的块首信息(如大小等)
4、将新块链入空表
36
Q

Egg Hunter原理

A

有时候可用的内存放不下shellcode,这时候需要先使用一小段代码(寻蛋代码),通过这小段代码找到真正的shellcode。这技术叫寻蛋技术

37
Q

Egg Hunter流程

A
  1. !mona pc 2000 用这段字符使程序崩溃
  2. !mona findmsp 找到EIP偏移
  3. 构造Stage1
    【515*‘A’】 #这里面放寻蛋指令
    【jmp esp地址】 #注意:不能是坏字符
    【jmp \xEB】 #跳转到寻蛋指令
  4. !mona egg –t b33f 生成寻蛋指令,这条指令32个字节,515-32=483
  5. 构造Stage1:
    【478个nop】
    【寻蛋指令】
    【5个nop】
    【jmp esp地址】
    【jmp eb指令】 向上跳60字节,32+5<60,所以是可以的
  6. 查看该程序应该还有其他参数可以写进内存,比如说‘User-Agent’,把这个参数值使用:
    【’b33fb33f’】
    【shellcode】
38
Q

怎样获得api函数地址

A

插件-常用api下断点-查看断点地址

39
Q

Windbg:

查看反汇编代码怎么看

A

u 地址

40
Q

Windbg:

查看数据结构

A

nt

nt!_PEB

41
Q

Windbg:

继续执行

A

g

42
Q

Windbg:

查看eax寄存器

A

reax

43
Q

Windbg:

显示所有加载模块

A

lm

44
Q

Windbg:

显示模块DSPrivateData64详细信息

A

显示指定模块的详细信息