windbg 学习中对一个pe文件调试,当载入后可用线程查看指令 ~* 查看一些初步信息:
图片中 ID并不是TID,而是windbg 为它分配的一个ID号,_main**后面的地址01201136即为pe文件的OEP地址
对该地址下断地 进入:
然后进入__tmainCRTStartup, uf 函数完整反汇编(u向下反汇编,ub向上反汇编),可以看见内容很多,这里面后半段位置调用了
真正的入口函数main,这个函数里对程序做了些初始化,不同的编译器代码不一样,这时进入mian函数:
上图中可以看见一条指令 mov eax,dword ptr [_security_cookie(012317b0)], 这个_security_cookie中存放这一个4字节的cookies,当程序被加载的时候
被计算出来的伪随机数,然后将他保存在程序的内存中的.data段,既012317b0地址处,在函数开头被拷贝到栈中,如图:
xor eax, ebx ; mov dowrd ptr [ebp-4], eax 将值取出与ebp异或然后保存在[ebp-4]处,[ebp+4](返回地址), [ebp] ,[ebp-4](cookie),[局部变量]
函数结尾处会将.data中的值取出与栈中的值比较,不相等就说明栈被破坏,程序退出。
程序执行时所有函数均用这一个cookie值
使用 kpnf 指令查看栈信息:
k 表示查看栈信息,p 显示函数的所有参数,包括参数的名字、类型、值。n 显示调用栈的每帧编号。f 显示调用栈的每帧占用字节数。7 显示一条信息
其中ChildEBP是当前函数的EBP, RetAddr是返回地址,即父函数Call它的下一跳指令地址:
如上图:ebp+4保存的返回地址。
使用dv指令查看函数内部局部变量信息,通常与/i /t /v 连用:/i 显示变量是局部的、全局的、参数、还是函数等信息。/v 显示变量所在地址。/t 显示变量的类型
要查看某一函数时,可以与.frame连用,.frame 0,切换栈针到0栈针。
今晚小计到这儿。