【安全学习之路】Day46
最近网上找了一套课,打算看着先学学。
非常入门的一段helloworld代码。
因为getchar的存在所以需要我们输入任意字符来结束
重新编译一遍,这次在编译选项当中加入/W4,这个简单来讲就是严谨等级,应该是分为四个等级1最低,4最高。
这么编译之后,就会显示一些比较容易出歧义或者问题的报警,就像这里告诉我们两个没有引用的形参。
但实际上还是能出现这个中间的obj文件的。
在运行到这里之后就有观测条件了。
使用winhex查看内存中的这个进程
这个内存空间除了hello.exe之外,由多个dll作为支撑。
.
.
首先通过这里的%p输出这个n的地址,然后
可以看到这里给出的内存地址是
0DDEFEFF870
我们通过winhex查看内存的功能
(小端序)
可以看到这个程序的这个数据在内存中的形态。
。
。
。
后面讲的就是include实质内容
用预处理展示命令
可以看到出现了一个.i中间文件
点进内容查看之后可以看到这个里面是有一个将include的内容放进中间文件的一个步骤。
补充一个,include当中.c一般放功能性文件(产生处理器文件)
.h放一些声明性文件,后面逆向的时候可以注意下。
另外include不检查后缀名,意味着include"sasas.bmp"或者什么jpg也都是可以的。
。
printf格式化 输出到 标准输出设备(涉及驱动,编译原理)返回成功输出的字符数
MSDN里面的实例介绍。
重定向符号
getchar返回输入的内容的ascii值。
逆向工程核心原理
IMAGE_FILE_HEADER
主要是machine字段值发生变化,pe32为014c,pe32+为8664
IMAGE_OPTIONAL_HEADER
这个应该是变化最大的部分
看着很多,整理一下
Magic
这个作为标志位发生变化,32中是010b,32+为020b,windowsPE装载器通过检查这个字段的值来区分他是32位还是64
BASEOFDATA
在32中用于指示数据节的起始地址 64中删除了这个
IMAGEBASE
由原来的双字dword变为ulonglong类型,为了适应增大的进程虚拟内存。借助该字段,pe32+能加载到16t虚拟内存的任何位置。
堆和栈
相关数据类型也变为ulonglong型。
IMAGE_THUNK_DATA
字节大小改变了,从4变为8
其中IMAGE_IMPORT_DESCRIPTOR结构体的OriginalFirstThunk ( INT)与FirstThunk( IAT )字段值都是指向IMAGETHUNK DATA结构体数组的RVA
IMAGE_TLS_DIRECTORY
部分成员为VA,在32+被扩展为8个字节。
IMAGE_TLS_DIRECTORY结构体的startaddressofrawdata,endaddressofrawdata,addressofindex,addressofcallbacks字段持有的值都是VA值,所以他们也被扩展为64为中需要的8个字节。
WINDBG
这一章里面主要是作了WDG的一些介绍,后面实践的时候慢慢去弄。
64位调试
调试器
基本上向下兼容的。
调试
一个实例wow64test
这个实例里面的内容也很简单,调用getsystemdirectory,createfile,shgetspecial-floderpath,regcreatekey四个api,x86编译的程序在64位运行的时候就需要通过wow64进行重定向,重定向包括系统文件夹和注册表键值。
可以看到重定位下的具体值不太一样,后面的东西明天再研究。