网络攻击课件二进制代码分析

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CRx

EXE文件(DLL也一样)
• exe文件有自己的格式,有若干节(section ): • .text用来放二进制代码(exe或dll); • .data用来放各种全局数据。 • .rsrc • .rdata • .idata
观察EXE文件
• 用OllyDbg看节

• 用ida静态分析
– 入口地址 – 引用的dll函数库 – 函数名/地址
内存区域
• 区域指的是地址空间中的一片连续地址。区域的 必须是最小单位(一般是64k)的整数倍。区域的状 态有空闲、私有、映射、映像。 • 进程可以用VirtualAlloc/ VirtualFree申请/删除区 域,这时候的区域状态是私有,但是还不可以存 取数据,因为还需要和物理内存关联。 • 当exe或DLL文件被映射进了进程空间后,区域状 态变成映像;当一般数据文件被映射进了进程空 间后,区域状态变成映射。
• if ( v2 == 267 ) • { • if ( *(_DWORD *)(v1 + 116) > 0xEu ) • { • v3 = 0; • v4 = *(_DWORD *)(v1 + 232) == 0; • goto LABEL_10; • } • LABEL_5: • v20 = 0; • goto LABEL_11; • } • 【备注行】
• SUSPENDED模式(CREATE_SUSPENDED)
Exe和dll
• 系统DLL
– kernel32.dll user32.dll ntdll.dll shell32.dll GDI32.dll OLE32.dll comctl32.dll ,,, – msvcr71.dll msvcr90.dll – mfc42.dll mfc71.dll mfc80.dll mfc90.dll – WS2_32.dll / Winsock.dll


Βιβλιοθήκη Baidu 代码、数据、堆栈
• CS IP • DS ES • SS SP
• EIP ESP • 访问非法地址
寄存器
• • • • • • • • AL,AH,AX,EAX,RAX AX,BX,CX,DX,BP,SP,SI,DI CS,DS,SS,ES,FS,GS FLAGS,IP CR0,CR1,CR2,CR3 调试寄存器 测试寄存器 …
Windows内存划分
• 0x00400000-0x7FFEFFFF(4M-2G)为独享用 户分区,这将近2G的空间是进程独享的。如果在 boot.ini上设置了/3G,这个区域的范围即从2G扩 大为3G:0x00010000-0xBFFE-FFFF。系统dll在 这个区域,比如是0x7xxxxxxx。 • 0x80000000-0xFFFFFFFF这个空间是供操作系 统内核代码、设备驱动程序、设备I/O高速缓存、 非页面内存池的分配、进程目表和页表等使用。 这段地址各进程是可以共享的。 • 如果在boot.ini上设置了/3G,这个区域的范围从 2G缩小为1G:0xC0000000-0xFFFFFFFF。
内存、地址
• • • • 物理内存 分段:CS DS ES SS FS GS 分页,页表,non-page 进程逻辑地址空间
物理内存
• 存储器分为CPU缓存(1/2/3级)、主存、外存(磁盘等)。主 机板上能够插放的物理内存条的个数和容量是有限制的。 • PC机上许多设备拥有自己的设备内存,这些设备内存会 映射到PC机的物理内存地址上,读写这段物理地址其实 会访问设备内存。 • Windows各系列支持的物理内存上限是不一样的,从2G 到64G不等。理论上32位CPU硬件上只能支持4G内存的 寻址,超过4G的内存只能靠其他技术来弥补。 • 比如Windows Server/32企业版即可使用超过4G物理内存 (虽然单进程地址空间仍限制是4G)。 • 物理内存分配的最小单位是页4K或4M(或者是其他值)。 8086开始支持的分段机制在i386之后被淡化。
jmp表
• • • • • • • • • • • • • @ILT+635(_bind@12): 00411280 jmp bind (411EF2h) @ILT+640(__msize_dbg): 00411285 jmp _msize_dbg (415320h) @ILT+645(__fcloseall): 0041128A jmp _fcloseall (416CA0h) … @ILT+680(_OutputDebugStringA@4): 004112AD jmp OutputDebugStringA (42598Ah) @ILT+685(?f1@@YAHHH@Z): 004112B2 jmp f1 (411C20h) @ILT+690(_WriteFile@20): 004112B7 jmp WriteFile (425978h)
页面属性
• 物理页面的访问属性指的是对页面进行的具体操作:可 读、可写、可执行。CPU一般认为可读就是可执行,操 作系统细分组合【备注行】。其中最后两个属性在运行 同一个程序的多个实例时非常有用,它使得程序可以共 享代码段和数据段。一般情况下,多个进程可以共享只 读或执行页面,如果要写的话,将会Copy页面到新的页 面(copy-on-write)。 属性PAGE_NOCACHE、PAGE_WRITECOMBINE是 开发设备驱动的时候需要的。 PAGE_GUARD属性,当往页面写入一个字节时,应用 程序会收到堆栈溢出通知,在线程堆栈时有用。
• •
映射过程
• • 进程地址空间的地址是虚拟地址,当取到指令时,需要把 虚拟地址转化为物理地址才能够存取数据。这个工作通过 页目和页表进行。 映射过程:逻辑地址高10位用来找到1024个页目项中的 一项,取出页表的物理地址后,利用中10位来得到页表项 的值,根据这个值得到物理页的地址,由于一页有4K大 小,利用低12位得到单元地址,这样就可以访问这个内存 单元了。 CPU的CR3寄存器会保存当前进程的页目物理地址。 当进程被创建时,同时需要创建页目和页表,一共需要 4.4M。在进程的空间中,0xC030 0000~0xC030 0FFF是 用来保存页目的4k空间。0xC000 0000~0xC03F FFFF是 用来保存页表的4M空间。也就是说程序里面访问这些地 址你是可以读取页目和页表的具体值的(要工作在内核方 式下)。
• _thiscall 是为了解决类成员调用中this指针传递而 规定的。_thiscall要求把this指针放在特定寄存器 中,该寄存器由编译器决定。VC使用ecx, Borland的C++编译器使用eax。返回方式和 _stdcall相当。 • PASCAL 是Pascal语言的函数调用方式,也可以 在C/C++中使用,参数压栈顺序与前两者相反。 • C中不加说明默认函数为_cdecl方式(C中也只能 用这种方式),C++也一样,但是默认的调用方 式可以在IDE环境中设置。
装载exe
• 装载一个exe文件时,系统不会将整个exe 文件和所有的DLL文件装载进物理内存中, 同时它也不会装载进页面文件中。相反, 它会建立文件映射,也就是利用exe本身当 作页面文件。系统将部分二进制代码装载 进内存,分配页面给它。

Exe\dll在一起:内存布局
• 系统DLL起始逻辑地址一般大于0x5* • Copy-on-write机制
32bit 4GB
• • • • x86 i386 x86-64 IA-64 Itanium (安腾)
• 32位地址 • 4G地址空间
Windows内存划分
• 32位系统上进程地址空间是2^32=4G,范 围从0x0000 0000~0xFFFF FFFF。 • 0x00000000-0x0000FFFF(0k-64k)为 NULL指针范围,如果访问该范围(以及其他 未经映射的页面)会报告非法访问。另外, DOS程序还使用这个区域。 • 0x00010000-0x003FFFFF (64k-4M)为 DOS程序保留,在某些条件下可以读写。
tasklist /m
• 观察重要的DLL

重要的dll函数
• • • • • bind send recv connect hmemcpy (in win9x) GetWindowText GetDlgItemText MessageBox
• 用IDA查看系统DLL:导出函数
Exe文件:visual studio角度
函数调用约定风格
• _cdecl 是C Declaration的缩写,C语言默认的函 数调用方法:所有参数从右到左依次入栈,参数 由调用者清除。 • _stdcall 是Standard Call的缩写,是C++的标准调 用方式:所有参数从右到左依次入栈(调用类成 员时,最后一个入栈的是this指针)。参数由被调 用的函数在返回后清除,使用的指令是 retn X,X 表示参数占用的字节数。 • _fastcall 是编译器指定的快速调用方式。由于大 多数的函数参数个数很少,使用堆栈传递比较费 时。因此_fastcall通常规定将前两个(或若干个 )参数由寄存器传递,其余参数还是通过堆栈传 递。不同编译器编译的程序规定的寄存器不同。 返回方式和_stdcall相当。
Ollydbg(od)的使用
• 汇编/寄存器/栈/数据窗口 • 内存地图 • …
使用断点
• • • • 在当前某行 在某地址、在某个地址范围 某个条件触发 当执行、读、写时
• 某个系统dll函数
演示bp bind
• 使用bp bind • 修改bind端口+1
在运行中:修改exe代码和数据
• 调试模式(DEBUG_PROCESS)
关于
• 那些盗版、破解软件,那些外挂程序,都 是什么人、怎么做的,用的什么技术和方 法啊? • 我和你一样好奇。 • 本文向你解释他们怎么做的。 • 虽然本文的示例程序一般从C源程序开始, 但是他们显然没有。 • 事实上,他们直接拿二进制程序开刀。
From the very begin:文件格式
• 数据文件
– – – – – – – – 纯文本 格式文本 带指令的文本(word宏) 脚本文件 EXE,ELF,a.out 静态lib DLL,SO 驱动文件,modules in linux
• 程序文件
Windows的系统文件
• Exe、dll、sys • 配置文件 C:\WINDOWS\system32\config\system C:\WINDOWS\system32\config\sam C:\WINDOWS\repair\sam • Windows的系统文件de自我保护
• •
PT

交换文件
• 交换文件是存在硬盘上的系统文件,它的大小 可以在系统属性里面设置,它相当于物理内存 ,所以称为虚拟内存。它的大小是影响系统快 慢的关键因素之一,尤其是物理内存不多的情 况下。 分页内存Paged Pool和非分页内存Nonpaged Pool区别:分页内存是指可以被交换到硬盘上 的内存页,非分页内存是指不能被换出的内存 页,即他只能存在于物理内存内,被交换到硬 盘上。
• 用OllyDbg查看布局
阅读exe代码
• 静态分析:IDA • 动态调试:ollydbg
用IDA查看EXE/DLL
• 二进制、汇编、伪代码、调用图
• • • • • Section/segment 函数:导入和导出 起始地址 函数/代码调用关系图 伪代码:F5
IDA:汇编代码和流程图

P-code
• • • • • • • main.c main.exe 观察:汇编、机器码 观察:函数、地址 观察:局部变量和BP 观察:参数和堆栈 观察:函数返回时参数ESP调整
用vc看函数调用过程
• • • • • • • • • • int f1(int a , int b) { int c; c=a+b; return c; } main() { int s = f1(0x11223344,0x55667788); printf… }
相关文档
最新文档