Practice: Week6

45
1 Practice: Week6

description

Practice: Week6. Problem 1. Byte Ordering. Implement a function is_little_endian(), which returns 1 if it is running on little-endian machine and 0 if it is running on big-endian machine. (This function should be able to run on any machine regardless of difference of word size.). - PowerPoint PPT Presentation

Transcript of Practice: Week6

Page 1: Practice: Week6

1

Practice: Week6

Page 2: Practice: Week6

2

Problem 1

Page 3: Practice: Week6

3

Byte Ordering

Implement a function is_little_endian(), which returns 1 if it is running on little-endian machine and 0 if it is running on big-endian machine. (This function should be able to run on any machine regardless of difference of word size.)

Page 4: Practice: Week6

4

Byte Ordering

Implement a function is_little_endian(), which returns 1 if it is running on little-endian machine and 0 if it is running on big-endian machine. (This function should be able to run on any machine regardless of difference of word size.)

int is_little_endian()

{

int x=1;

return (int)(*(char *)&x);

}

Page 5: Practice: Week6

5

Problem 2

Page 6: Practice: Week6

Conversions Between Signed and UnsignedWe are running programs on a machine where values of type int are 32 bits. They are represented in two’s complement, and they are right shifted arithmetically. Values of type unsigned are also 32 bits.

We generate arbitrary values x and y, and convert them to unsigned values as follows:

/* Create some arbitrary values */

int x = random();

int y = random();

/* Convert to unsigned */

unsigned ux = (unsigned)x;

unsigned uy = (unsigned)y;

Page 7: Practice: Week6

Conversions Between Signed and UnsignedFor each of the following C expressions, you are to indicate whether or not the expression always yields 1. If it always yields 1, describe the underlying mathematical principles. Otherwise, give an example of arguments that make it yield 0.

A. (x>y) == (-x<-y)

B. ((x+y)<<5) + x-y == 31*y+33*x

C. ~x + ~y == ~(x+y)

D. (int) (ux-uy) == -(y-x)

E. ((x >> 1) << 1) <= x

Page 8: Practice: Week6

Conversions Between Signed and UnsignedA. (x>y) == (-x<-y). No

Let x = TMin32, y = 0.

Page 9: Practice: Week6

Conversions Between Signed and UnsignedA. (x>y) == (-x<-y). No

Let x = TMin32, y = 0.

B. ((x+y)<<5) + x-y == 31*y+33*x. Yes

from the ring properties of two’s complement arithmetic.

Page 10: Practice: Week6

Conversions Between Signed and UnsignedA. (x>y) == (-x<-y). No

Let x = TMin32, y = 0.

B. ((x+y)<<5) + x-y == 31*y+33*x. Yes

from the ring properties of two’s complement arithmetic.

C. ~x + ~y == ~(x+y). No

let x= 0,y= 0.

Page 11: Practice: Week6

Conversions Between Signed and UnsignedA. (x>y) == (-x<-y). No

Let x = TMin32, y = 0.

B. ((x+y)<<5) + x-y == 31*y+33*x. Yes

from the ring properties of two’s complement arithmetic.

C. ~x + ~y == ~(x+y). No

let x= 0,y= 0.

D. (int) (ux-uy) == -(y-x). Yes

Due to the isomorphism between two’s complement and unsigned arithmetic.

Page 12: Practice: Week6

Conversions Between Signed and UnsignedA. (x>y) == (-x<-y). No

Let x = TMin32, y = 0.

B. ((x+y)<<5) + x-y == 31*y+33*x. Yes

from the ring properties of two’s complement arithmetic.

C. ~x + ~y == ~(x+y). No

let x= 0,y= 0.

D. (int) (ux-uy) == -(y-x). Yes

Due to the isomorphism between two’s complement and unsigned arithmetic.

E. ((x >> 1) << 1) <= x. Yes

Right shift rounds toward minus infinity.

Page 13: Practice: Week6

13

Problem 3

Page 14: Practice: Week6

Bit Operations

14

/* [absValue]

* – Calculate the absolute value of x

*

* Example: absValue(5) = 5, absValue(-29) = 29

* Legal ops: ~ & ^ | - << >>

*/

int absValue(int x) {

/* Please fill your code*/

return ret;

}

Page 15: Practice: Week6

Bit Operations

15

/* [absValue]

* – Calculate the absolute value of x

*

* Example: absValue(5) = 5, absValue(-29) = 29

* Legal ops: ~ & ^ | - << >>

*/

int absValue(int x) {

/* Please fill your code*/

int mask = X >> 31

return (x ^ mask) – mask;

}

Page 16: Practice: Week6

16

Problem 4

Page 17: Practice: Week6

17

Operation Dest Value

subl (%ebx),%eax

incl 4(%eax)

decl %ecx

imull $4,0x100(%edx,%ecx,4)

notl (%eax, %edx)

andl (%eax,%ecx,8),%eax

leal 9(%eax,%ecx,2),%edx

Address value

0x100 0xFFFF FFFF

0x104 0x8765 4321

0x108 0x0000 0001

0x10C 0x0000 0002

0x110 0x2234 7688

0x114 0x1234 5678

register value

%eax 0x8765 4421

%ebx 0x0000 0104

%ecx 0x0000 0002

%edx 0x0000 0008

1. 32-bit little endian machine2. 4 byte size and hex3. Each operation take effect on the memory and register

Page 18: Practice: Week6

18

Operation Dest Value

subl (%ebx),%eax

incl 4(%eax)

decl %ecx

imull $4,0x100(%edx,%ecx,4)

notl (%eax, %edx)

andl (%eax,%ecx,8),%eax

leal 9(%eax,%ecx,2),%edx

Address value

0x100 0xFFFF FFFF

0x104 0x8765 4321

0x108 0x0000 0001

0x10C 0x0000 0002

0x110 0x2234 7688

0x114 0x1234 5678

register value

%eax 0x8765 4421

%ebx 0x0000 0104

%ecx 0x0000 0002

%edx 0x0000 0008

1. 32-bit little endian machine2. 4 byte size and hex3. Each operation take effect on the memory and register

Page 19: Practice: Week6

19

Operation Dest Value

subl (%ebx),%eax %eax 0x00000100

incl 4(%eax)

decl %ecx

imull $4,0x100(%edx,%ecx,4)

notl (%eax, %edx)

andl (%eax,%ecx,8),%eax

leal 9(%eax,%ecx,2),%edx

Address value

0x100 0xFFFF FFFF

0x104 0x8765 4321

0x108 0x0000 0001

0x10C 0x0000 0002

0x110 0x2234 7688

0x114 0x1234 5678

register value

%eax 0x8765 4421

%ebx 0x0000 0104

%ecx 0x0000 0002

%edx 0x0000 0008

1. 32-bit little endian machine2. 4 byte size and hex3. Each operation take effect on the memory and register

Page 20: Practice: Week6

20

Operation Dest Value

subl (%ebx),%eax %eax 0x00000100

incl 4(%eax)

decl %ecx

imull $4,0x100(%edx,%ecx,4)

notl (%eax, %edx)

andl (%eax,%ecx,8),%eax

leal 9(%eax,%ecx,2),%edx

Address value

0x100 0xFFFF FFFF

0x104 0x8765 4321

0x108 0x0000 0001

0x10C 0x0000 0002

0x110 0x2234 7688

0x114 0x1234 5678

register value

%eax 0x0000 0100

%ebx 0x0000 0104

%ecx 0x0000 0002

%edx 0x0000 0008

1. 32-bit little endian machine2. 4 byte size and hex3. Each operation take effect on the memory and register

Page 21: Practice: Week6

21

Operation Dest Value

subl (%ebx),%eax %eax 0x00000100

incl 4(%eax) 0x104 0x87654322

decl %ecx

imull $4,0x100(%edx,%ecx,4)

notl (%eax, %edx)

andl (%eax,%ecx,8),%eax

leal 9(%eax,%ecx,2),%edx

Address value

0x100 0xFFFF FFFF

0x104 0x8765 4321

0x108 0x0000 0001

0x10C 0x0000 0002

0x110 0x2234 7688

0x114 0x1234 5678

register value

%eax 0x0000 0100

%ebx 0x0000 0104

%ecx 0x0000 0002

%edx 0x0000 0008

1. 32-bit little endian machine2. 4 byte size and hex3. Each operation take effect on the memory and register

Page 22: Practice: Week6

22

Operation Dest Value

subl (%ebx),%eax %eax 0x00000100

incl 4(%eax) 0x104 0x87654322

decl %ecx

imull $4,0x100(%edx,%ecx,4)

notl (%eax, %edx)

andl (%eax,%ecx,8),%eax

leal 9(%eax,%ecx,2),%edx

Address value

0x100 0xFFFF FFFF

0x104 0x8765 4322

0x108 0x0000 0001

0x10C 0x0000 0002

0x110 0x2234 7688

0x114 0x1234 5678

register value

%eax 0x0000 0100

%ebx 0x0000 0104

%ecx 0x0000 0002

%edx 0x0000 0008

1. 32-bit little endian machine2. 4 byte size and hex3. Each operation take effect on the memory and register

Page 23: Practice: Week6

23

Operation Dest Value

subl (%ebx),%eax %eax 0x00000100

incl 4(%eax) 0x104 0x87654322

decl %ecx %ecx 0x00000001

imull $4,0x100(%edx,%ecx,4)

notl (%eax, %edx)

andl (%eax,%ecx,8),%eax

leal 9(%eax,%ecx,2),%edx

Address value

0x100 0xFFFF FFFF

0x104 0x8765 4322

0x108 0x0000 0001

0x10C 0x0000 0002

0x110 0x2234 7688

0x114 0x1234 5678

register value

%eax 0x0000 0100

%ebx 0x0000 0104

%ecx 0x0000 0002

%edx 0x0000 0008

1. 32-bit little endian machine2. 4 byte size and hex3. Each operation take effect on the memory and register

Page 24: Practice: Week6

24

Operation Dest Value

subl (%ebx),%eax %eax 0x00000100

incl 4(%eax) 0x104 0x87654322

decl %ecx %ecx 0x00000001

imull $4,0x100(%edx,%ecx,4)

notl (%eax, %edx)

andl (%eax,%ecx,8),%eax

leal 9(%eax,%ecx,2),%edx

Address value

0x100 0xFFFF FFFF

0x104 0x8765 4322

0x108 0x0000 0001

0x10C 0x0000 0002

0x110 0x2234 7688

0x114 0x1234 5678

register value

%eax 0x0000 0100

%ebx 0x0000 0104

%ecx 0x0000 0001

%edx 0x0000 0008

1. 32-bit little endian machine2. 4 byte size and hex3. Each operation take effect on the memory and register

Page 25: Practice: Week6

25

Operation Dest Value

subl (%ebx),%eax %eax 0x00000100

incl 4(%eax) 0x104 0x87654322

decl %ecx %ecx 0x00000001

imull $4,0x100(%edx,%ecx,4) 0x10C 0x00000008

notl (%eax, %edx)

andl (%eax,%ecx,8),%eax

leal 9(%eax,%ecx,2),%edx

Address value

0x100 0xFFFF FFFF

0x104 0x8765 4322

0x108 0x0000 0001

0x10C 0x0000 0002

0x110 0x2234 7688

0x114 0x1234 5678

register value

%eax 0x0000 0100

%ebx 0x0000 0104

%ecx 0x0000 0001

%edx 0x0000 0008

1. 32-bit little endian machine2. 4 byte size and hex3. Each operation take effect on the memory and register

Page 26: Practice: Week6

26

Operation Dest Value

subl (%ebx),%eax %eax 0x00000100

incl 4(%eax) 0x104 0x87654322

decl %ecx %ecx 0x00000001

imull $4,0x100(%edx,%ecx,4) 0x10C 0x00000008

notl (%eax, %edx)

andl (%eax,%ecx,8),%eax

leal 9(%eax,%ecx,2),%edx

Address value

0x100 0xFFFF FFFF

0x104 0x8765 4322

0x108 0x0000 0001

0x10C 0x0000 0008

0x110 0x2234 7688

0x114 0x1234 5678

register value

%eax 0x0000 0100

%ebx 0x0000 0104

%ecx 0x0000 0001

%edx 0x0000 0008

1. 32-bit little endian machine2. 4 byte size and hex3. Each operation take effect on the memory and register

Page 27: Practice: Week6

27

Operation Dest Value

subl (%ebx),%eax %eax 0x00000100

incl 4(%eax) 0x104 0x87654322

decl %ecx %ecx 0x00000001

imull $4,0x100(%edx,%ecx,4) 0x10C 0x00000008

notl (%eax, %edx) 0x108 0xFFFFFFFE

andl (%eax,%ecx,8),%eax

leal 9(%eax,%ecx,2),%edx

Address value

0x100 0xFFFF FFFF

0x104 0x8765 4322

0x108 0x0000 0001

0x10C 0x0000 0008

0x110 0x2234 7688

0x114 0x1234 5678

register value

%eax 0x0000 0100

%ebx 0x0000 0104

%ecx 0x0000 0001

%edx 0x0000 0008

1. 32-bit little endian machine2. 4 byte size and hex3. Each operation take effect on the memory and register

Page 28: Practice: Week6

28

Operation Dest Value

subl (%ebx),%eax %eax 0x00000100

incl 4(%eax) 0x104 0x87654322

decl %ecx %ecx 0x00000001

imull $4,0x100(%edx,%ecx,4) 0x10C 0x00000008

notl (%eax, %edx) 0x108 0xFFFFFFFE

andl (%eax,%ecx,8),%eax

leal 9(%eax,%ecx,2),%edx

Address value

0x100 0xFFFF FFFF

0x104 0x8765 4322

0x108 0xFFFF FFFE

0x10C 0x0000 0008

0x110 0x2234 7688

0x114 0x1234 5678

register value

%eax 0x0000 0100

%ebx 0x0000 0104

%ecx 0x0000 0001

%edx 0x0000 0008

1. 32-bit little endian machine2. 4 byte size and hex3. Each operation take effect on the memory and register

Page 29: Practice: Week6

29

Operation Dest Value

subl (%ebx),%eax %eax 0x00000100

incl 4(%eax) 0x104 0x87654322

decl %ecx %ecx 0x00000001

imull $4,0x100(%edx,%ecx,4) 0x10C 0x00000008

notl (%eax, %edx) 0x108 0xFFFFFFFE

andl (%eax,%ecx,8),%eax %eax 0x00000100

leal 9(%eax,%ecx,2),%edx

Address value

0x100 0xFFFF FFFF

0x104 0x8765 4322

0x108 0xFFFF FFFE

0x10C 0x0000 0008

0x110 0x2234 7688

0x114 0x1234 5678

register value

%eax 0x0000 0100

%ebx 0x0000 0104

%ecx 0x0000 0001

%edx 0x0000 0008

1. 32-bit little endian machine2. 4 byte size and hex3. Each operation take effect on the memory and register

Page 30: Practice: Week6

30

Operation Dest Value

subl (%ebx),%eax %eax 0x00000100

incl 4(%eax) 0x104 0x87654322

decl %ecx %ecx 0x00000001

imull $4,0x100(%edx,%ecx,4) 0x10C 0x00000008

notl (%eax, %edx) 0x108 0xFFFFFFFE

andl (%eax,%ecx,8),%eax %eax 0x00000100

leal 9(%eax,%ecx,2),%edx

Address value

0x100 0xFFFF FFFF

0x104 0x8765 4322

0x108 0xFFFF FFFE

0x10C 0x0000 0008

0x110 0x2234 7688

0x114 0x1234 5678

register value

%eax 0x0000 0100

%ebx 0x0000 0104

%ecx 0x0000 0001

%edx 0x0000 0008

1. 32-bit little endian machine2. 4 byte size and hex3. Each operation take effect on the memory and register

Page 31: Practice: Week6

31

Operation Dest Value

subl (%ebx),%eax %eax 0x00000100

incl 4(%eax) 0x104 0x87654322

decl %ecx %ecx 0x00000001

imull $4,0x100(%edx,%ecx,4) 0x10C 0x00000008

notl (%eax, %edx) 0x108 0xFFFFFFFE

andl (%eax,%ecx,8),%eax %eax 0x00000100

leal 9(%eax,%ecx,2),%edx %edx 0x10B

Address value

0x100 0xFFFF FFFF

0x104 0x8765 4322

0x108 0xFFFF FFFE

0x10C 0x0000 0008

0x110 0x2234 7688

0x114 0x1234 5678

register value

%eax 0x0000 0100

%ebx 0x0000 0104

%ecx 0x0000 0001

%edx 0x0000 0008

1. 32-bit little endian machine2. 4 byte size and hex3. Each operation take effect on the memory and register

Page 32: Practice: Week6

32

Operation Dest Value

subl (%ebx),%eax %eax 0x00000100

incl 4(%eax) 0x104 0x87654322

decl %ecx %ecx 0x00000001

imull $4,0x100(%edx,%ecx,4) 0x10C 0x00000008

notl (%eax, %edx) 0x108 0xFFFFFFFE

andl (%eax,%ecx,8),%eax %eax 0x00000100

leal 9(%eax,%ecx,2),%edx %edx 0x10B

Address value

0x100 0xFFFF FFFF

0x104 0x8765 4322

0x108 0xFFFF FFFE

0x10C 0x0000 0008

0x110 0x2234 7688

0x114 0x1234 5678

register value

%eax 0x0000 0100

%ebx 0x0000 0104

%ecx 0x0000 0001

%edx 0x0000 010B

1. 32-bit little endian machine2. 4 byte size and hex3. Each operation take effect on the memory and register

Page 33: Practice: Week6

33

Problem 5

Page 34: Practice: Week6

Switch

Suppose the following C code and assembly code are executed on a 32-bit little endian machine. Read the code and answer the following questions:

int switch_example(int op, int a, int b){

int result;

switch (op) {

case 80:

result = a * 5;

break;

case _[1]_:

result = b + 10;

break;

case 83:

result = b >> 2;

break;

case _[2]_: case _[3]_:

if (_[4]_)

result = _[5]_;

else

result = _[6]_;

break;

default:

result = 0;

break;

}

return result;

}

Page 35: Practice: Week6

Switch

35

_switch_example: pushl %ebp movl %esp, %ebp subl $16, %esp movl 8(%ebp), %eax subl __[10]__, %eax cmpl __[11]__, %eax ja __[12]__ jmp __[13]__ L3: movl 12(%ebp), %eax imull $5, %eax movl %eax, -4(%ebp) jmp L11L4: movl 16(%ebp), %eax addl $10, %eax movl %eax, -4(%ebp) jmp L11 L5: movl 16(%ebp), %eax sarl $2, %eax movl %eax, -4(%ebp) jmp L11

L6: movl 12(%ebp), %eax

cmpl 16(%ebp), %eax

jge __[14]__

movl 12(%ebp), %eax

subl $3, %eax

movl %eax, -4(%ebp)

jmp L11

L9: movl 16(%ebp), %eax

imull $4, %eax

movl %eax, -4(%ebp)

jmp L11

L2: movl $0, -4(%ebp)

L11: movl -4(%ebp), %eax

leave

ret

.section

.rodata

.align 4

L7:

.long L3

.long L2

.long L4

.long _[7]_

.long _[8]_

.long L2

.long L2

.long _[9]_

op at %ebp+8 a at %ebp+12 b at %ebp+16result at %ebp-4

Page 36: Practice: Week6

36

_switch_example: pushl %ebp movl %esp, %ebp subl $16, %esp movl 8(%ebp), %eax subl __[10]__, %eax cmpl __[11]__, %eax ja __[12]__ jmp __[13]__ L3: movl 12(%ebp), %eax imull $5, %eax movl %eax, -4(%ebp) jmp L11L4: movl 16(%ebp), %eax addl $10, %eax movl %eax, -4(%ebp) jmp L11 L5: movl 16(%ebp), %eax sarl $2, %eax movl %eax, -4(%ebp) jmp L11

L6: movl 12(%ebp), %eax

cmpl 16(%ebp), %eax

jge __[14]__

movl 12(%ebp), %eax

subl $3, %eax

movl %eax, -4(%ebp)

jmp L11

L9: movl 16(%ebp), %eax

imull $4, %eax

movl %eax, -4(%ebp)

jmp L11

L2: movl $0, -4(%ebp)

L11: movl -4(%ebp), %eax

leave

ret

.section

.rodata

.align 4

L7:

.long L3

.long L2

.long L4

.long _[7]_

.long _[8]_

.long L2

.long L2

.long _[9]_

Please explain the advantage and limitation of “Jump Table”, and provide a simple code which is not suitable to be translated into a “Jump Table”

Page 37: Practice: Week6

37

Security vulnerability in the XDR library

“Aside Security vulnerability in the XDR library”

Answer: practice problem 2.37

void *result = malloc(ele_cnt * ele_size);

if (result == NULL)

/* malloc failed */

return NULL;

Page 38: Practice: Week6

38

Security vulnerability in the XDR library

“Aside Security vulnerability in the XDR library”

Answer: practice problem 2.37

long long unsigned asize = ele_cnt * (long long unsigned) ele_size;

void *result = malloc(asize);

if (result == NULL)

/* malloc failed */

return NULL;

Page 39: Practice: Week6

39

Security vulnerability in the XDR library

“Aside Security vulnerability in the XDR library”

Answer: practice problem 2.37

long long unsigned required_size = ele_cnt * (long long unsigned) ele_size;

size_t request_size = (size_t) required_size;

if (required_size != request_size)

/* Overflow must have occurred. Abort */

return NULL;

void *result = malloc(request_size);

if (result == NULL)

/* malloc failed */

return NULL;

Page 40: Practice: Week6

40

Advanced Topic: Integer Security

Buffer Overflow: Array allocation

“malloc(n * size)”

Overflow: 2^30 * 2^3 = 0

Smaller buffer than expected

Memory corruption: iphone jaibreak (CVE-2011-0226)

Page 41: Practice: Week6

41

Advanced Topic: Integer Security

Logical Bug

Linux kernel OOM killer (CVE-2011-4097)

Compute “memory usage score” for each process

kill process with the highest score

Score: nr_pages * 1000 / nr_totalpages

Malicious process

consume too much memory a low score

trick the kernel into killing innocent process

Page 42: Practice: Week6

42

Advanced Topic: Integer Security

An emerging threat

2007 CVE survey:

“integer overflows, barely in the top 10 overall in the past few years, are number 2 for OS vender advisories, behind buffer overflow”

2010 ~ early 2011 CVE survey: Linux kernel

More than 1/3 of serious bugs are integer errors

Page 43: Practice: Week6

43

Advanced Topic: Integer Security

What’s wrong?From: linux driver/gpu/drm/vmwgfx/vmwgfx_kms.c

u32 pitch = /*from user space*/

u32 height = /*from user space*/

u32 size = pitch * height;

if (size > vram_size) return;

Page 44: Practice: Week6

44

Advanced Topic: Integer Security

What’s wrong?From: linux driver/gpu/drm/vmwgfx/vmwgfx_kms.c

u32 pitch = /*from user space*/

u32 height = /*from user space*/

u32 size = pitch * height;

if (size > vram_size) return;

Patch: use 64 bits?

u64 size = pitch * height;

if (size > vram_size) return;

Page 45: Practice: Week6

45

Advanced Topic: Integer Security

What’s wrong?From: linux driver/gpu/drm/vmwgfx/vmwgfx_kms.c

u32 pitch = /*from user space*/

u32 height = /*from user space*/

u32 size = pitch * height;

if (size > vram_size) return;

Patch2: convert pitch and height to u64 first!

u64 size = (u64)pitch * (u64)height;

if (size > vram_size) return;