首页
社区
课程
招聘
[注意]严重的错误..第53页"big endian 计算机系统"
发表于: 2008-10-29 20:34 6521

[注意]严重的错误..第53页"big endian 计算机系统"

2008-10-29 20:34
6521
这书是好书.支持中文原创..
只是这个错误是在太明显..而且太重要了..
现在的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.

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (9)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
抱歉..没留意标题有三个"注意"..
2008-10-29 20:41
0
雪    币: 2056
活跃值: (13)
能力值: ( LV13,RANK:250 )
在线值:
发帖
回帖
粉丝
3
??????
2008-10-30 11:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
同类型错误.96页.图5.3.6
那画应该是相反顺序
l     i     a   f
t    s    e   w
90 90  90  \
90 90  90 90
....
7c 81 cd da

--> 位移之后
81 cd da 90

前面那个贴子预览了两次.所以有三个"注意"显然某位斑竹已经帮改正了.谢谢.
2008-11-1 01:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
抽空接着看..
同类型错误.p.246: "如果忘记了,请查阅4.2.2节中关于"大顶机"的论述"
2008-11-2 17:47
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
第352页:
static char addr[100];
....
...
strncpy(addr,inet_ntoa(in),sizeof(addr))

第一个错误: if 下面那个语句没有分号 :P

第二个问题:
实验得知.sizeof(addr) ==100

另:
char arrray1[] = "aaaa"
sizeof(array1) == 5

不知道这个漏洞发生在那个版本的gcc.?
2008-11-3 10:40
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
p.170:
"这里,我们不妨以0x7ffdf024处的 RtlEnterCriticalSection()指针作为目标..."
结合上下文和shellcode
应该是0x7ffdf020
2008-11-7 16:06
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
请failwest再次讲解一下这个问题
我现在对这个问题卡在这里了~~
2008-12-13 03:37
0
雪    币: 2056
活跃值: (13)
能力值: ( LV13,RANK:250 )
在线值:
发帖
回帖
粉丝
9
任何一本书都会有错,这是难免的,而且其中很多都是笔误或者印刷错误,听说书的第二次印刷已经出了,修正了很多错误,而且failwest计划出第二版,应该会奉献给大家更精彩的内容。

LS的是什么问题?
2008-12-13 11:00
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
就是这个第五章的问题。。
很郁闷~~
2008-12-30 07:06
0
游客
登录 | 注册 方可回帖
返回
//