《灰帽Python-黑客和逆向工程师的Python编程》学习记录

ctypes是Python语言的一个外部库,提供和C语言兼容的数据类型,可以很方便的调用C DLL中的函数。

操作环境:CentOS6.5

Python版本:2.66


    ctypes是强大的,强大到本书以后介绍的几乎所有库都要基于此。使用它我们就能够调用动态链接库中函数,同时创建各种复杂的C数据类型和底层操作函数。毫无疑问,ctypes就是本书的基础。

第一章 搭建开发环境

1.3.2 使用动态链接库

from ctypes import *
libc = CDLL("libc.so.6")
message_string = "Hello world!\n"
libc.printf("Testing:%s",message_string)
[[email protected] python_test]# python huimao.py
Testing:Hello world!

1.3.3 构造C数据类型

  使用Python创建一个C数据类型很简单,你可以很容易的使用由C或者C++些的组件。下面显示了三者之间的对于关系。

_______________________________________________________________________________

C Type                      Python Type           ctypes Type

_______________________________________________________________________________

char                      1-character string            c_char

wchar_t                   1-character Unicode string     c_wchar

char                      int/long                    c_byte

char                      int/long                    c_ubyte

short                     int/long                    c_short

unsigned short            int/long                    c_ushort

int                       int/long                    C_int

unsigned int              int/long                    c_uint

long                      int/long                    c_long

unsigned long             int/long                    c_ulong

long long                 int/long                    c_longlong

unsigned long long        int/long                    c_ulonglong

float                     float                       c_float

double                    float                       c_double

char * (NULL terminated)     string or none           c_char_p

wchar_t * (NULL terminated)  unicode or none          c_wchar_p

void *                       int/long or none         c_void_p

  

1.3.5 定义结构体和联合

from ctypes import *

class barley_amount(Union):
	_fields_ = [
	("barley_long", c_long),
	("barley_init", c_int),
	("barley_char", c_char*8),
	]
value = raw_input("Enter the amount of barey to put into the beer vat:")
my_barley = barley_amount(int(value))
print "Barley amount as a long:%ld"% my_barley.barley_long
print "Barley amount as an int:%d" % my_barley.barley_long
print"Barley amount as a char:%s" % my_barley.barley_char

 结果:

[[email protected] huimao]# python 1.py
Enter the amount of barey to put into the beer vat:67
Barley amount as a long:67
Barley amount as an int:67
Barley amount as a char:C

  其中67是C的ASCII码。

第二章 调试器设计

  a.黑盒测试与白盒测试

许多的开发平台都会包含一个自带的调试器,允许开发工具结合源代码对程序进行精确的跟踪测试。这就是白盒调试。当我们很难得到源代码的时候,开发者,逆向工程师,Hacker就会应用黑盒调试跟踪目标程序。黑盒调试中,被测试的软件对黑客来说是不透明的,唯一能看到的就是反汇编代码。这时候要分析出程序的运作流程,找出程序的错误将变得更复杂,花费的时间也会更多。但是高超的逆向技术集合优秀的逆向工具将使这个过程变得简单,轻松,有时候善于此道的黑客,甚至比开发者更了解软件:)。

  b.黑盒测试的两种模式

用户模式 和 内核模式。用户模式(通常指的是ring3级的程序)是你平时运行用户程序的一般模式(普通的程序)。用户模式的权限是最低的。当你运行“运算器(cacl.exe)[Windows]、bc[Linux]”的时候,就会产生一个用户级别的进程;对这个进程的调试就是用户模式调试。核心模式的权限是最高的。这里运行着操作系统内核,驱动程序,底层组件。当运行Wireshark嗅探数据包的时候,就是和一个工作在内核的网络驱动交互。如果你想暂停驱动或者检测驱动状态,就需要使用支持内核模式的调试器了。

  c.PyDbg和Immunity

PyDbg (byPedram Amini)和Immunity Debugger (from Immunity, Inc.)。PyDbg 是一个纯Python实现的调试器,让黑客能够用Python语言全面的控制一个进程,实现自动化调试。Immunity调试器则是一个会让你眼前一亮的调试器,界面相当的友好,类似OllyDbg,但是拥有更强大的功能以及更多的Python调试库。这两个调试器在本书的后面章节将会详细的介绍。现在先让我们深入了解调试器的一般原理。

2.1通用CPU寄存

     CPU的寄存器能够对少量的数据进行快速的存取访问。在x86指令集里,一个CPU有八个通用寄存器:EAX, EDX, ECX, ESI, EDI, EBP, ESP和 EBX。还有很多别的寄存器,遇到的时候具体讲解。这八个通用寄存器各有不同的用途,了解它们的作用对于我们设计调试器是至关重要的。让我们先简略的看一看每个寄存器和功能。最后我们将通过一个简单的实验来说明他它们的使用方法。
        EAX寄存器也叫做累加寄存器,除了用于存储函数的返回值外也用于执行计算的操作。许多优化的x86指令集都专门设计了针对EAX寄存器的读写和计算指令。列如从最基本的加减,比较到特殊的乘除操作都有专门的EAX优化指令。
   前面我们说了,函数的返回值也是存储在EAX寄存器里。这一点很重要,因为通过返回的EAX里的值我们可以判断函数是执行成功与否,或者得到确切返回值。
        EDX寄存器也叫做数据寄存器。这个寄存器从本质上来说是EAX寄存器的延伸,它辅助EAX完成更多复杂的计算操作像乘法和除法。它虽然也能当作通用寄存器使用,不过更多的是结合EAX寄存器进行计算操作。
        ECX寄存器,也叫做计数寄存器,用于循环操作,比如重复的字符存储操作,或者数字统计。有一点很重要,ECX寄存器的计算是向下而不是向上的(简单理解就是用于循环操作时是由大减到小的)。

看一下下面的Python片段:
___________________________________________________________________________

counter = 0

while counter < 10:

     print "Loop number: %d" % counter

     counter += 1
_______________________________________________________________________________

             如果你把这代码转化成汇编代码,你会看到第一轮的时候ECX将等于10,第二轮的时候等于9,如此反复知道ECX减少到0。这很容易让人困惑,因为这和Python的循环刚好代码相反,但是只要记得ECX是向下计算的就行了。
         在x86汇编里,依靠ESI和EDI寄存器能对需要循环操作的数据进行高效的处理。ESI寄存器是源操作数指针,存储着输入的数据流的位置。EDI寄存器是目的操作数指针,存储了计算结果存储的位置。简而言之,ESI(source index)用于读,EDI(destination index)用于写。用源操作数指针和目的操作数指针,极大的提高了程序处理数据的效率。
        ESP 和 EBP 分别是栈指针和基指针。这两个寄存器共同负责函数的调用和栈的操作。当一个函数被调用的时候,函数需要的参数被陆续压进栈内最后函数的返回地址也被压进。ESP指着栈顶,也就是返回地址。EBP则指着栈的底端。有时候,编译器能够做出优化,释放EBP,使其不再用于栈的操作,只作为普通的寄存器使用。
        EBX是唯一一个没有特殊用途的寄存器。它能够作为额外的数据储存器。
     还有一个需要提及的寄存器就是EIP。这个寄存器总是指向马上要执行的指令。当CPU执行一个程序的成千上万的代码的时候,EIP会实时的指向当前CPU马上要执行到的位置。
          一个调试器必须能够很方便的获取和修改这些寄存器的内容。每一个操作系统都提供了一个接口让调试器和CPU交互,以便能够获取和修改这些值。

  

  

《灰帽Python-黑客和逆向工程师的Python编程》学习记录,布布扣,bubuko.com

时间: 2024-10-10 14:20:28

《灰帽Python-黑客和逆向工程师的Python编程》学习记录的相关文章

[TCP/IP详解卷1:协议] Chapter2.链路层

链路层三个目的:(TCP/IP支持各种链路层协议:以太网,令牌环网,光纤分布式数据接口.etc) (1)为IP模块收发IP数据包. (2)为ARP模块发送ARP请求和接受ARP应答. (3)为RARP发送RARP请求和接受RARP应答. 以太网 以太网是当今TCP/IP采用的主要局域网技术.使用CSMA/CD媒体接入方法. 802.2定义802网络共有的逻辑链路控制. 802.3针对整个CSMA/CD网络. 802.4针对令牌总线网络. 802.5针对令牌环网络. 原文地址:https://ww

《TCP/IP详解 卷1:协议》读书笔记

第一章 概述 协议栈 应用层 HTTP,FTP   运输层 TCP, UDP 段(Segment) 网络层 IP, ICMP, IGMP 数据报(Datagram) 链路层   帧(Frame) 物理层     应用层关心的是应用程序的细节,而不是数据在网络中的传输活动:下面四层对应用程序一无所知,但它们要处理所有的通信细节. 互联网地址 端口号 周知端口号(Well-Known Ports) 1-255 Unix系统占用端口 256-1023 临时可分配端口 1024-5000 为其他服务预留

《TCP/IP详解卷1:协议》第14章 DNS:域名系统---读书笔记

<TCP/IP详解卷1:协议>第14章 DNS:域名系统---读书笔记 1.引言 5.指针查询 DNS中一直难于理解的部分就是指针查询方式,即给定一个IP地址,返回与该地址对应的域名. 当一个组织加入Internet,并获得DNS域名空间的授权,如noao.edu,则它们也获得了对应IP地址的in-addr.arpa域名空间的授权.在noao.edu这个例子中,它的网络号是140.252的B类网络.在DNS树中结点in-addr.arpa的下一级必须是该IP地址的第一字节(例中为140),再下

《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(2)-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(1)-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(2)-读书笔记 <TCP/IP详解卷1:协议>第4章 ARP:地址解析协议-读书笔记 <TCP/IP详解卷1:协议>第5章 RARP:逆地址解析协议-读书笔记 <TCP/IP详解卷1:协

《TCP/IP详解卷1:协议》第5章 RARP:逆地址解析协议-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(1)-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(2)-读书笔记 <TCP/IP详解卷1:协议>第4章 ARP:地址解析协议-读书笔记 <TCP/IP详解卷1:协议>第5章 RARP:逆地址解析协议-读书笔记 1.引言 具有本地磁盘的系统引导

《TCP/IP详解卷1:协议》第3章 IP:网际协议(1)-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 1.引言 IP是TCP/IP协议族中最核心的协议.所有的TCP.UDP.ICMP及IGMP数据都以IP数据报格式传输.IP提供不可靠.无连接的数据报传送服务. (1)不可靠 它不能保证IP数据报能成功地到达目的地.IP仅提供最好的传输服务.如果发生某种错误,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息报给信源端.

《TCP/IP详解卷2:实现》笔记--域和协议

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Net/3组把协议关联到一个域,并且用一个协议族常量来标识每个域.Net/3还通过所有的编址方法将协议分组.在一个域中</span> 的每个协议使用同类地址,并且每种地址只被一个域使用.作为结果,一个域能通过它的协议族或地址族常量唯一标识. 下图是是我们讨论的协议和常量. 1

《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(1)-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(1)-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(2)-读书笔记 <TCP/IP详解卷1:协议>第4章 ARP:地址解析协议-读书笔记 <TCP/IP详解卷1:协议>第5章 RARP:逆地址解析协议-读书笔记 <TCP/IP详解卷1:协

《TCP/IP详解卷1:协议》第6章 ICMP:Internet控制报文协议-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(1)-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(2)-读书笔记 <TCP/IP详解卷1:协议>第4章 ARP:地址解析协议-读书笔记 <TCP/IP详解卷1:协议>第5章 RARP:逆地址解析协议-读书笔记 <TCP/IP详解卷1:协

《TCP/IP详解卷1:协议》第4章 ARP:地址解析协议-读书笔记

章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(1)-读书笔记 <TCP/IP详解卷1:协议>第3章 IP:网际协议(2)-读书笔记 <TCP/IP详解卷1:协议>第4章 ARP:地址解析协议-读书笔记 1.引言 当一台主机把以太网数据帧发送到位于同一局域网上的另一台主机时,是根据48 bit的以太网地址来确定目的接口的