这书是好书.支持中文原创..
只是这个错误是在太明显..而且太重要了..
现在的pc一般都是little endian.(请自行google.)
简单的说.lowest bit store in the lowest memory.
看似简单..但..弄懂这个其实有点绕..
顺便推荐下the art of exploitation.第二版.英文版.最核心的入侵内容在里面都讲了.
(需要熟悉linux)
本人总结了一下little endian..(不要嫌我罗嗦.^^)
首先是储存:
假设输入的是的是字符串'thist' -- "\x74\x68\x69\x73\x74"
在内存中.
00 - 74
01 - 68
02 - 69
03 - 73
05 - 74
因为" "是表示数据是string由bytes 组成 (byte - db)
as assemble
mov [bp], 't'
mov [bp+1],'h'
mov [bp+2],'i'
mov [bp+3],'s'
mov [bp+4],'t'
假设要pop value -- 当value 是
double word: (dd)
0x73696874
msb lsb
single byte: (db)
0x74
0x68
0x69
0x73
half word: (dw)
0x6874
0x7369
所以.: 当通过string输入return address的时候
比如像输入 0xbffff102
如果直接输入 就相当于
mov byte ptr [byte], bf
00 bf
mov byte ptr [byte], ff
01 ff
mov byte ptr [byte], f1
02 f1
mov byte ptr [byte], 02
03 02
但是当然读取数据时.
pop eax (4 byte-dd)
eax =
0x02f1ffbf
msb lsb
所以.
应当输入: \x02\xf1\xff\xbf
00 02
01 f1
02 ff
03 bf
被读取时.
pop eax(4 byte)
0xbffff102
最最最最容易混淆的地方在于这里.
摘录:
little-endian:计算机体系结构中一种描述多字节存储顺序的术语,在这种机
制中最不重要字节(LSB)存放在最低端的地址上。采用这种机制的处理器有PDP-11、
VAX、Intel系列微处理器和一些网络通信设备。该术语除了描述多字节存储顺序外
还常常用来描述一个字节中各个比特的排放次序。
+———-+
| 0×12 |<– 0×00000021
+———-+
| 0×34 |<– 0×00000020
+———-+
图3:双字节数0×1234以little-endian的方式存在起始地址0×00000020中
在Little-Endian中,对于bit序列中的序号编排和Big-Endian刚好相反,其方
式如下(以双字节数0×8B8A为例):
bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+—————————————–+
val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |
+—————————————–+
^ 0×8B 0×8A ^
拿0x1234来举例.注意这里的输入不是string("\x12\x34")!!! 是完整的0x1234 word
mov word ptr [bp], 0x1234h
00 34
01 12
当读取的时候
pop ax(2 byte)
ax为
12 34
msb lsb
0x8b8a
mov word ptr [bp],0x8b8a
00 8a
01 8b
pop ax(2 byte)
8b ba
msb lsb
归纳:
* 最值得注意的就是.在反输入地址的时候.mov 的是byte.而ret 读取地址的时候.pop的是4 byte
mov a
mov b
mov c
mov d
pop ax ; 0xdcba
所以要反向写.
* 也可知.在储存string的时候.如果输入的是"thisismypassword"
00 16 --> 内存地址.
t h i s m y p a s s w o r d --> 相对的数据.
* 最终:
输入数据的lsb存储在最低的地址.
00 lsb
0x msb
当读取的时候.就要先读lsb.根据读取的大小不同.内容也就不同.
byte : lsb
word: msb+1 lsb | m+1 m (m 为内存地址)
double word: msb+3 lsb+2 lsb+1 lsb
| m+3 m+2 m+1 m
debug 是按照b, h, w 显示: 如果读出的数据是b,h,w.
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!