7-24
pwn题:level2
用ida打开,发现vulnerable()里长这样:
考虑可以把函数的返回地址修改为system()的地址,再把参数变为”/bin/sh“
exp:
1 | p = remote("220.249.52.133", 31379) |
还是有些不太懂的地方
逆向工程核心原理
小端序标记法
字节序是多字节数据在计算机内存中储存或网络传输时各字节的储存顺序,主要分为两类:小端序(little endian)和大端序(big endian)。
字节序
采用大端序存储数据时,内存地址低位存储数据的高位,内存地址高位存储数据的低位;采用小端序存储数据时,地址高位存储数据的高位,地址低位存储数据的低位。
数据为单一字节时无论采用大端序还是小端序保存,字节存储顺序都一样。字符数组在内存中时连续的,向字符数组存放数据,无论采用大端序还是小端序,存储顺序都相同。
大端序和小端序
网络协议中经常采用大端序方式,通过网络传输应用程序使用数据时,往往需要修改字节序。
小端序采用逆序方式存储数据,使用小端序进行算数运算以及扩展、缩小数据时,效率非常高
IA-32寄存器
Intel Architecture 32位
通用寄存器
通用寄存器用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果。IA-32中每个通用寄存器的大小都是32位,即4个字节,用于保存常量与地址等。
1 | EAX:(0~31)32位 |
1 | EAX:针对操作数和结果数据的累加器 |
段寄存器
段是一种内存保护技术。它把内存划分为多个区段,并为每个段赋予起始地址、范围、访问权限等。
段与分页技术一起用于将虚拟内存变更为实际物理内存。段内存记录在段描述符表中,段寄存器就持有这些段描述符表的索引
段寄存器总共有6种寄存器:
1 | CS:代码段寄存器 存放应用程序代码所在段的段基址 |
每个寄存器的大小为16位(2个字节),每个段寄存器指向的段描述符与虚拟内存结合,形成一个线性地址,借助分页技术转换为物理地址