Introduc)on to x86 Architecture

Size: px
Start display at page:

Download "Introduc)on to x86 Architecture"

Transcription

1 Introduc)on to x86 Architecture

2 Objec)ves Introduce students to fundamental aspects of the x86 architecture Develop understanding of common x86 assembly instruc)ons 8/28/2015 2

3 Credit Many of these slides have been taken/ adapted from the Open Security Training Courses. hjp://opensecuritytraining.info/training.html They are licensed under a Crea)ve Commons License: hjp://crea)vecommons.org/licenses/by- sa/3.0 Students interested in this area are encouraged to u)lize this resource 8/28/2015 3

4 What you're going to learn #include <stdio.h> int main(){ prinx( Hello World!\n ); return 0x1234; } 8/28/2015 4

5 Is the same as.text: main.text: push ebp.text: mov ebp, esp.text: push offset ahelloworld ; "Hello world!\n".text: call ds:printf.text: e add esp, 4.text: mov eax, 1234h.text: pop ebp.text: retn Windows Visual C , Optimizations Disabled 8/28/2015 Disassembled with IDA Pro 5.0 Free Version 5

6 With op)miza)ons.text: main.text: push offset ahelloworld ; "Hello World!\n".text: call ds:printf.text: b pop ecx.text: c mov eax, 1234h.text: retn Windows Visual C , Optimizations Enabled Disassembled with IDA Pro 5.0 Free Version 8/28/2015 6

7 Refresher - Data Types double/long long?-> long double? int/long In C: char short 8/28/2015 7

8 Refresher - Alt. Radices Decimal, Binary, Hexidecimal Learn This! Decimal (base 10) Binary (base 2) Hex (base 16) b 0x b 0x b 0x b 0x b 0x b 0x b 0x b 0x b 0x b 0x b 0x0A b 0x0B b 0x0C b 0x0D b 0x0E 15 8/28/ b 0x0F 8

9 Architecture - CISC vs. RISC Intel is CISC - Complex Instruc)on Set Computer Many very special purpose instruc)ons that you will never see, and a given compiler may never use - just need to know how to use the manual Variable- length instruc)ons, between 1 and 16(?) bytes long. 16 is max len in theory, I don't know if it can happen in prac)ce Other major architectures are typically RISC - Reduced Instruc)on Set Computer Typically more registers, less and fixed- size instruc)ons Examples: PowerPC, ARM, SPARC, MIPS 8/28/2015 9

10 Architecture - Endian Endianness comes from Jonathan Swil's Gulliver's Travels. It doesn't majer which way you eat your eggs :) LiJle Endian - 0x stored in RAM lijle end first. The least significant byte of a word or larger is stored in the lowest address. E.g. 0x Intel is LiJle Endian Big Endian - 0x stored as is. Network traffic is Big Endian Most everyone else you've heard of (PowerPC, ARM, SPARC, MIPS) is either Big Endian by default or can be configured as either (Bi- Endian) 8/28/

11 Architecture - Registers Registers are small memory storage areas built into the processor (s)ll vola)le memory) 8 general purpose registers + the instruc)on pointer which points at the next instruc)on to execute But two of the 8 are not that general On x86-32, registers are 32 bits long On x86-64, they're 64 bits 8/28/ Book p. 25

12 Architecture - Register Conven)ons 1 These are Intel's suggestions to compiler developers (and assembly handcoders). Registers don't have to be used these ways, but if you see them being used like this, you'll know why. But I simplified some descriptions. I also color coded as GREEN for the ones which we will actually see in this class (as opposed to future ones), and RED for not. EAX - Stores function return values EBX - Base pointer to the data section ECX - Counter for string and loop operations EDX - I/O pointer Intel 8/28/2015 Arch v1 Section General-Purpose Registers 12

13 Architecture - Registers Conven)ons 2 ESI - Source pointer for string operations EDI - Destination pointer for string operations ESP - Stack pointer EBP - Stack frame base pointer EIP - Pointer to next instruction to execute ( instruction pointer ) 8/28/

14 Architecture - Registers Conven)ons 3 Caller- save registers - eax, edx, ecx If the caller has anything in the registers that it cares about, the caller is in charge of saving the value before a call to a subrou)ne, and restoring the value aler the call returns Put another way - the callee can (and is highly likely to) modify values in caller- save registers Callee- save registers - ebp, ebx, esi, edi If the callee needs to use more registers than are saved by the caller, the callee is responsible for making sure the values are stored/ restored Put another way - the callee must be a good ci)zen and not modify registers which the caller didn't save, unless the callee itself saves and restores the exis)ng values 8/28/

15 Architecture - Registers - 8/16/32 bit addressing 1 8/28/

16 Architecture - Registers - 8/16/32 bit addressing 2 8/28/

17 Architecture - EFLAGS EFLAGS register holds many single bit flags. Will only ask you to remember the following for now. Zero Flag (ZF) - Set if the result of some instruction is zero; cleared otherwise. Sign Flag (SF) - Set equal to the most-significant bit of the result, which is the sign bit of a signed integer. (0 indicates a positive value and 1 indicates a negative value.) Intel Vol 1 Sec page /28/

18 The Stack The stack is a conceptual area of main memory (RAM) which is designated by the OS when a program is started. Different OS start it at different addresses by conven)on A stack is a Last- In- First- Out (LIFO/FILO) data structure where data is "pushed" on to the top of the stack and "popped" off the top. By conven)on the stack grows toward lower memory addresses. Adding something to the stack means the top of the stack is now at a lower memory address. 8/28/

19 The Stack 2 As already men)oned, esp points to the top of the stack, the lowest address which is being used While data will exist at addresses beyond the top of the stack, it is considered ined The stack keeps track of which func)ons were called before the current one, it holds local variables and is frequently used to pass arguments to the next func)on to be called. A firm understanding of what is happening on the stack is *essen$al* to understanding a program's opera)on. 8/28/

20 2 PUSH - Push Word, Doubleword or Quadword onto the Stack For our purposes, it will always be a DWORD (4 bytes). Can either be an immediate (a numeric constant), or the value in a register The push instruction automatically decrements the stack pointer, esp, by 4. 8/28/

21 Registers Before eax 0x esp 0x0012FF8C push eax Registers After eax 0x esp 0x0012FF88 Stack Before Stack After 0x0012FF90 0x x esp 0x0012FF8C 0x x x0012FF88 esp 0x x0012FF84 0x0012FF80 8/28/

22 3 POP- Pop a Value from the Stack Take a DWORD off the stack, put it in a register, and increment esp by 4 8/28/

23 Registers Before eax 0xFFFFFFFF esp 0x0012FF88 pop eax Stack Before Registers After eax 0x esp 0x0012FF8C Stack After 0x0012FF90 0x x x0012FF8C 0x esp 0x esp 0x0012FF88 0x (0x ) 0x0012FF84 0x0012FF80 8/28/

24 Exercise 1 8/28/

25 Calling Conven)ons How code calls a subrou)ne is compiler- dependent and configurable. But there are a few conven)ons. We will only deal with the cdecl and stdcall conven)ons. More info at hjp://en.wikipedia.org/wiki/x86_calling_conven)ons hjp:// conven)ons 8/28/

26 Calling Conven)ons - cdecl C declara)on - most common calling conven)on Func)on parameters pushed onto stack right to lel Saves the old stack frame pointer and sets up a new stack frame eax or edx:eax returns the result for primi)ve data types Caller is responsible for cleaning up the stack 8/28/

27 Calling Conven)ons - stdcall I typically only see this conven)on used by Microsol C++ code - e.g. Win32 API Func)on parameters pushed onto stack right to lel Saves the old stack frame pointer and sets up a new stack frame eax or edx:eax returns the result for primi)ve data types Callee responsible for cleaning up any stack parameters it takes 8/28/

28 4 CALL - Call Procedure CALL's job is to transfer control to a different func)on, in a way that control can later be resumed where it lel off First it pushes the address of the next instruc)on onto the stack For use by RET for when the procedure is done Then it changes eip to the address given in the instruc)on Des)na)on address can be specified in mul)ple ways Absolute address Rela)ve address (rela)ve to the end of the instruc)on) 8/28/ Book p. 132

29 5 RET - Return from Procedure Two forms Pop the top of the stack into eip (remember pop increments stack pointer) In this form, the instruc)on is just wrijen as ret Typically used by cdecl func)ons Pop the top of the stack into eip and add a constant number of bytes to esp In this form, the instruc)on is wrijen as ret 0x8, or ret 0x20, etc Typically used by stdcall func)ons 8/28/

30 6 MOV - Move Can move: register to register memory to register, register to memory immediate to register, immediate to memory Never memory to memory! Memory addresses are given in r/m32 form talked about later 8/28/

31 7 8 ADD and SUB Adds or Subtracts, just as expected Des)na)on operand can be r/m32 or register Source operand can be r/m32 or register or immediate No source and des)na)on as r/m32s, because that could allow for memory to memory transfer, which isn't allowed on x86 Evaluates the opera)on as if it were on signed AND unsigned data, and sets flags as appropriate. Instruc)ons modify OF, SF, ZF, AF, PF, and CF flags add esp, 8 sub eax, [ebx*2] 8/28/ Add p. 202, Sub p. 210

32 General Stack Frame Opera)on We are going to pretend that main() is the very first function being executed in a program. This is what its stack looks like to start with (assuming it has any local variables). Local Variables stack bottom main() frame stack top 8/28/

33 General Stack Frame Opera)on 2 When main() decides to call a subroutine, main() becomes the caller. We will assume main() has some registers it would like to remain the same, so it will save them. We will also assume that the callee function takes some input arguments. Local Variables Caller-Save Registers Arguments to Pass to Callee stack bottom main() frame stack top 8/28/

34 General Stack Frame Opera)on 3 When main() actually issues the CALL instruction, the return address gets saved onto the stack, and because the next instruction after the call will be the beginning of the called function, we consider the frame to have changed to the callee. Local Variables Caller-Save Registers Arguments to Pass to Callee Caller's saved return address stack bottom main() frame stack top 8/28/

35 General Stack Frame Opera)on 4 When foo() starts, the frame pointer (ebp) still points to main()'s frame. So the first thing it does is to save the old frame pointer on the stack and set the new value to point to its own frame. Local Variables Caller-Save Registers Arguments to Pass to Callee Caller's saved return address Saved Frame Pointer stack bottom main() frame foo()'s frame stack top 8/28/

36 General Stack Frame Opera)on 5 Next, we'll assume the the callee foo() would like to use all the registers, and must therefore save the callee-save registers. Then it will allocate space for its local variables. Local Variables Caller-Save Registers Arguments to Pass to Callee Caller's saved return address Saved Frame Pointer Callee-Save Registers stack bottom main() frame foo()'s frame stack top Local Variables 8/28/

37 General Stack Frame Opera)on 6 At this point, foo() decides it wants to call bar(). It is still the callee-ofmain(), but it will now be the caller-of-bar. So it saves any caller-save registers that it needs to. It then puts the function arguments on the stack as well. Saved Frame Pointer Callee-Save Registers Local Variables Caller-Save Registers Arguments to Pass to Callee stack bottom main() frame foo()'s frame stack top 8/28/

38 General Stack Frame Layout Every part of the stack frame is technically optional (that is, you can hand code asm without following the conventions.) But compilers generate code which uses portions if they are needed. Which pieces are used can sometimes be manipulated with compiler options. (E.g. omit frame pointers, changing calling convention to pass arguments in registers, etc.) Saved Frame Pointer Callee-Save Registers Local Variables Caller-Save Registers Arguments to Pass to Callee stack bottom main() frame foo()'s frame stack top 8/28/

39 Stack Frames are a Linked List! The ebp in the current frame points at the saved ebp of the previous frame. stack bottom main() frame foo()'s frame bar()'s frame stack top 8/28/

40 Example1.c The stack frames in this example will be very simple. Only saved frame pointer (ebp) and saved return addresses (eip). //Example1 - using the stack //to call subrou)nes //New instruc)ons: //push, pop, call, ret, mov int sub(){ return 0xbeef; } int main(){ sub(); return 0xf00d; } sub: push ebp mov ebp,esp mov eax,0beefh pop ebp ret main: push ebp mov ebp,esp call sub (401000h) mov eax,0f00dh D pop E ret ebp 8/28/

41 eax ebp esp Example1.c 1: EIP = , but no instruc)on yet executed 0x003435C0 z 0x0012FFB8 z 0x0012FF6C z Key: x executed instruction, c modified value z start value sub: push ebp mov ebp,esp mov eax,0beefh pop ebp ret main: push ebp mov ebp,esp call sub (401000h) mov eax,0f00dh Belongs to the frame *before* main() is called 0x0012FF6C 0x0012FF68 0x0012FF64 0x0012FF60 0x0012FF5C 0x0012FF58 0x004012E8 z D pop ebp E ret 8/28/

42 Example1.c 2 eax ebp esp 0x003435C0 z 0x0012FFB8 z 0x0012FF68 c Key: x executed instruction, c modified value z start value sub: push ebp mov ebp,esp mov eax,0beefh pop ebp ret main: push ebp x mov ebp,esp call sub (401000h) mov eax,0f00dh 0x0012FF6C 0x0012FF68 0x0012FF64 0x0012FF60 0x0012FF5C 0x0012FF58 0x004012E8 z 0x0012FFB8 c D pop ebp E ret 8/28/

43 Example1.c 3 eax ebp esp 0x003435C0 z 0x0012FF68 c 0x0012FF68 Key: x executed instruction, c modified value z start value sub: push ebp mov ebp,esp mov eax,0beefh pop ebp ret main: push ebp mov ebp,esp x call sub (401000h) mov eax,0f00dh 0x0012FF6C 0x0012FF68 0x0012FF64 0x0012FF60 0x0012FF5C 0x0012FF58 0x004012E8 z 0x0012FFB D pop ebp E ret 8/28/

44 Example1.c 4 eax ebp esp 0x003435C0 z 0x0012FF68 0x0012FF64 c Key: x executed instruction, c modified value z start value sub: push ebp mov ebp,esp mov eax,0beefh pop ebp ret main: push ebp mov ebp,esp call sub (401000h) x mov eax,0f00dh 0x0012FF6C 0x0012FF68 0x0012FF64 0x0012FF60 0x0012FF5C 0x0012FF58 0x004012E8 z 0x0012FFB8 0x c D pop ebp E ret 8/28/

45 Example1.c 5 eax ebp esp 0x003435C0 z 0x0012FF68 0x0012FF60 c Key: x executed instruction, c modified value z start value sub: push ebp x mov ebp,esp mov eax,0beefh pop ebp ret main: push ebp mov ebp,esp call sub (401000h) mov eax,0f00dh D pop E ret ebp 0x0012FF6C 0x0012FF68 0x0012FF64 0x0012FF60 0x0012FF5C 0x0012FF58 0x004012E8 z 0x0012FFB8 0x x0012FF68 c 8/28/

46 Example1.c 6 eax ebp esp 0x003435C0 z 0x0012FF60 c 0x0012FF60 Key: x executed instruction, c modified value z start value sub: push ebp mov ebp,esp x mov eax,0beefh pop ebp ret main: push ebp mov ebp,esp call sub (401000h) mov eax,0f00dh D pop E ret ebp 0x0012FF6C 0x0012FF68 0x0012FF64 0x0012FF60 0x0012FF5C 0x0012FF58 0x004012E8 z 0x0012FFB8 0x x0012FF68 8/28/

47 Example1.c 6 STACK FRAME TIME OUT sub push mov mov pop retn main push mov call mov pop retn ebp ebp, esp eax, 0BEEFh ebp ebp ebp, esp _sub eax, 0F00Dh ebp Function-beforemain 's frame main's frame (saved frame pointer and saved return address) sub's frame (only saved frame pointer, because it doesn't call anything else, and doesn't have local variables) 0x0012FF6C 0x0012FF68 0x0012FF64 0x0012FF60 0x0012FF5C 0x0012FF58 0x004012E8 z 0x0012FFB8 0x x0012FF68 8/28/

48 Example1.c 7 eax ebp esp 0x0000BEEF 0x0012FF60 0x0012FF60 Key: x executed instruction, c modified value z start value sub: push ebp mov ebp,esp mov eax,0beefh x pop ebp ret main: push ebp mov ebp,esp call sub (401000h) mov eax,0f00dh D pop ebp E ret 0x0012FF6C 0x0012FF68 0x0012FF64 0x0012FF60 0x0012FF5C 0x0012FF58 0x004012E8 z 0x0012FFB8 0x x0012FF68 8/28/

49 Example1.c 8 eax ebp esp 0x0000BEEF 0x0012FF68 c 0x0012FF64 c Key: x executed instruction, c modified value z start value sub: push ebp mov ebp,esp mov eax,0beefh pop ebp x ret main: push ebp mov ebp,esp call sub (401000h) mov eax,0f00dh D pop ebp E ret 0x0012FF6C 0x0012FF68 0x0012FF64 0x0012FF60 0x0012FF5C 0x0012FF58 0x004012E8 z 0x0012FFB8 0x c 8/28/

50 Example1.c 9 eax ebp esp 0x0000BEEF 0x0012FF68 0x0012FF68 c Key: x executed instruction, c modified value z start value sub: push ebp mov ebp,esp mov eax,0beefh pop ebp ret x main: push ebp mov ebp,esp call sub (401000h) mov eax,0f00dh D pop ebp E ret 0x0012FF6C 0x0012FF68 0x0012FF64 0x0012FF60 0x0012FF5C 0x0012FF58 0x004012E8 z 0x0012FFB8 c 8/28/

51 Example1.c 9 eax ebp esp 0x0000F00D c 0x0012FF68 0x0012FF68 Key: x executed instruction, c modified value z start value sub: push ebp mov ebp,esp mov eax,0beefh pop ebp ret main: push ebp mov ebp,esp call sub (401000h) mov eax,0f00dh x D pop ebp E ret 0x0012FF6C 0x0012FF68 0x0012FF64 0x0012FF60 0x0012FF5C 0x0012FF58 0x004012E8 z 0x0012FFB8 8/28/

52 Example1.c 10 eax ebp esp 0x0000F00D 0x0012FFB8 c 0x0012FF6C c Key: x executed instruction, c modified value z start value sub: push ebp mov ebp,esp mov eax,0beefh pop ebp ret main: push ebp mov ebp,esp call sub (401000h) mov eax,0f00dh D pop ebp x E ret 0x0012FF6C 0x0012FF68 0x0012FF64 0x0012FF60 0x0012FF5C 0x0012FF58 0x004012E8 z c 8/28/

53 Example1.c 11 eax ebp esp 0x0000F00D 0x0012FFB8 0x0012FF70 c Key: x executed instruction, c modified value z start value sub: push ebp mov ebp,esp mov eax,0beefh pop ebp ret main: push ebp mov ebp,esp call sub (401000h) mov eax,0f00dh D pop ebp E ret x 0x0012FF6C 0x0012FF68 0x0012FF64 0x0012FF60 0x0012FF5C 0x0012FF58 c Execution would continue at the value ret 8/28/2015 removed from the stack: 0x004012E8 53

54 Example1 Notes sub() is deadcode - its return value is not used for anything, and main always returns 0xF00D. If op)miza)ons are turned on in the compiler, it would remove sub() Because there are no input parameters to sub(), there is no difference whether we compile as cdecl vs stdcall calling conven)ons 8/28/

55 Example2.c with Input parameters and Local Variables #include <stdlib.h> int sub(int x, int y){ return 2*x+y; } int main(int argc, char ** argv){ int a; a = atoi(argv[1]); return sub(argc,a); }.text: _sub: push ebp.text: mov ebp, esp.text: mov eax, [ebp+8].text: mov ecx, [ebp+0ch].text: lea eax, [ecx+eax*2].text: c pop ebp.text: d retn.text: _main: push ebp.text: mov ebp, esp.text: push ecx.text: mov eax, [ebp+0ch].text: mov ecx, [eax+4].text: a push ecx.text: b call dword ptr ds: imp atoi.text: add esp, 4.text: mov [ebp-4], eax.text: mov edx, [ebp-4].text: a push edx.text: b mov eax, [ebp+8].text: e push eax.text: f call _sub.text: add esp, 8.text: mov esp, ebp.text: pop ebp.text: a retn 8/28/

56 "r/m32" Addressing Forms Anywhere you see an r/m32 it means it could be taking a value either from a register, or a memory address. I'm just calling these r/m32 forms because anywhere you see r/ m32 in the manual, the instruc)on can be a varia)on of the below forms. In Intel syntax, most of the )me square brackets [] means to treat the value within as a memory address, and fetch the value at that address (like dereferencing a pointer) mov eax, ebx mov eax, [ebx] mov eax, [ebx+ecx*x] (X=1, 2, 4, 8) mov eax, [ebx+ecx*x+y] (Y= one byte, or 4 bytes, 0-2^32-1) Most complicated form is: [base + index*scale + disp] 8/28/2015 More info: Intel v2a, Section page in particular Tables 2-2 and 2-3

57 9 LEA - Load Effec)ve Address Frequently used with pointer arithme)c, some)mes for just arithme)c in general Uses the r/m32 form but is the excep$on to the rule that the square brackets [ ] syntax means dereference ( value at ) Example: ebx = 0x2, edx = 0x1000 lea eax, [edx+ebx*2] eax = 0x1004, not the value at 0x1004 8/28/

58 Example2.c - 1.text: _sub: push ebp.text: mov ebp, esp.text: mov eax, [ebp+8].text: mov ecx, [ebp+0ch].text: lea eax, [ecx+eax*2].text: c pop ebp.text: d retn.text: _main: push ebp x.text: mov ebp, esp.text: push ecx.text: mov eax, [ebp+0ch].text: mov ecx, [eax+4].text: a push ecx.text: b call dword ptr ds: imp atoi.text: add esp, 4.text: mov [ebp-4], eax.text: mov edx, [ebp-4].text: a push edx.text: b mov eax, [ebp+8].text: e push eax.text: f call _sub.text: add esp, 8.text: mov esp, ebp.text: pop ebp.text: a retn eax ecx edx ebp esp 0x0012FF30 0x0012FF2C 0x0012FF28 0x0012FF24 0x0012FF20 0x0012FF1C 0x0012FF18 0x0012FF14 0x0012FF10 0x0012FF0C 0xcafe z 0xbabe z 0xfeed z 0x0012FF50 z 0x0012FF24 c 0x12FFB0 (char ** argv)z 0x2 (int argc) z Addr after call _main z 0x0012FF50(saved ebp)c 8/28/ Key: executed instruction x, modified value c, arbitrary example start value z

59 Example2.c - 2.text: _sub: push ebp.text: mov ebp, esp.text: mov eax, [ebp+8].text: mov ecx, [ebp+0ch].text: lea eax, [ecx+eax*2].text: c pop ebp.text: d retn.text: _main: push ebp.text: mov ebp, esp x.text: push ecx.text: mov eax, [ebp+0ch].text: mov ecx, [eax+4].text: a push ecx.text: b call dword ptr ds: imp atoi.text: add esp, 4.text: mov [ebp-4], eax.text: mov edx, [ebp-4].text: a push edx.text: b mov eax, [ebp+8].text: e push eax.text: f call _sub.text: add esp, 8.text: mov esp, ebp.text: pop ebp.text: a retn eax ecx edx ebp esp 0x0012FF30 0x0012FF2C 0x0012FF28 0x0012FF24 0x0012FF20 0x0012FF1C 0x0012FF18 0x0012FF14 0x0012FF10 0x0012FF0C 0xcafe 0xbabe 0xfeed 0x0012FF24 c 0x0012FF24 0x12FFB0 (char ** argv) 0x2 (int argc) Addr after call _main 0x0012FF50 (saved ebp) 8/28/

60 Example2.c - 3.text: _sub: push ebp.text: mov ebp, esp.text: mov eax, [ebp+8].text: mov ecx, [ebp+0ch].text: lea eax, [ecx+eax*2].text: c pop ebp.text: d retn.text: _main: push ebp.text: mov ebp, esp.text: push ecx x.text: mov eax, [ebp+0ch].text: Caller-save, or mov ecx, [eax+4].text: a push ecx space for local.text: b call dword ptr ds: imp atoi var? This time it.text: add esp, 4.text: turns out to be mov [ebp-4], eax.text: space for local var mov edx, [ebp-4].text: a since there is no push edx.text: b corresponding pop, mov eax, [ebp+8].text: e and the address is push eax.text: f call _sub used later to refer.text: add esp, 8 to the value we.text: mov esp, ebp.text: know is stored in a. pop ebp.text: a retn eax ecx edx ebp esp 0x0012FF30 0x0012FF2C 0x0012FF28 0x0012FF24 0x0012FF20 0x0012FF1C 0x0012FF18 0x0012FF14 0x0012FF10 0x0012FF0C 0xcafe 0xbabe 0xfeed 0x0012FF24 0x0012FF20 c 0x12FFB0 (char ** argv) 0x2 (int argc) Addr after call _main 0x0012FF50 (saved ebp) 0xbabe (int a) c 8/28/

61 Example2.c - 4.text: _sub: push ebp.text: mov ebp, esp.text: mov eax, [ebp+8].text: mov ecx, [ebp+0ch].text: lea eax, [ecx+eax*2].text: c pop ebp.text: d retn.text: _main: push ebp.text: mov ebp, esp.text: push ecx.text: mov eax, [ebp+0ch] x.text: mov ecx, [eax+4].text: a Getting the push ecx.text: b call dword ptr ds: imp atoi.text: base of the add esp, 4.text: argv char * mov [ebp-4], eax.text: mov edx, [ebp-4].text: a array (aka push edx.text: b mov eax, [ebp+8] argv[0]).text: e push eax.text: f call _sub.text: add esp, 8.text: mov esp, ebp.text: pop ebp.text: a retn eax ecx edx ebp esp 0x0012FF30 0x0012FF2C 0x0012FF28 0x0012FF24 0x0012FF20 0x0012FF1C 0x0012FF18 0x0012FF14 0x0012FF10 0x0012FF0C 0x12FFB0 c 0xbabe 0xfeed 0x0012FF24 0x0012FF20 0x12FFB0 (char ** argv) 0x2 (int argc) Addr after call _main 0x0012FF50 (saved ebp) 0xbabe (int a) 8/28/

62 Example2-5.text: _sub: push ebp.text: mov ebp, esp.text: mov eax, [ebp+8].text: mov ecx, [ebp+0ch].text: lea eax, [ecx+eax*2].text: c pop ebp.text: d retn.text: _main: push ebp.text: mov ebp, esp.text: push ecx.text: mov eax, [ebp+0ch].text: mov ecx, [eax+4] x.text: a push ecx.text: b Getting the call dword ptr ds: imp atoi.text: add esp, 4 char * at.text: mov [ebp-4], eax.text: argv[1] mov edx, [ebp-4].text: a push edx (I chose.text: b mov eax, [ebp+8].text: e 0x12FFD4 push eax.text: f arbitrarily since call _sub.text: add esp, 8 it's out of the.text: mov esp, ebp.text: stack scope pop ebp.text: a eax ecx edx ebp esp 0x0012FF30 0x0012FF2C 0x0012FF28 0x0012FF24 0x0012FF20 0x0012FF1C 0x0012FF18 0x0012FF14 0x0012FF10 0x0012FF0C 0x12FFB0 0x12FFD4c (arbitraryz ) 0xfeed 0x0012FF24 0x0012FF20 0x12FFB0 (char ** argv) 0x2 (int argc) Addr after call _main 0x0012FF50 (saved ebp) 0xbabe (int a) we're currently retn looking 8/28/2015 at) 62

63 Example2-6.text: _sub: push ebp.text: mov ebp, esp.text: mov eax, [ebp+8].text: mov ecx, [ebp+0ch].text: lea eax, [ecx+eax*2].text: c Saving some pop ebp.text: d slides retn.text: This will push _main: the push ebp.text: address of the mov ebp, esp.text: string at argv[1] push ecx.text: (0x12FFD4). atoi() mov eax, [ebp+0ch].text: will read the string mov ecx, [eax+4].text: a and turn in into an push ecx x.text: b int, put that int in call dword ptr ds: imp atoi x.text: eax, and return. add esp, 4 x.text: Then the adding 4 mov [ebp-4], eax.text: to esp will negate mov edx, [ebp-4].text: a the having pushed push edx.text: b the input parameter mov eax, [ebp+8].text: e and make push eax.text: f 0x12FF1C call _sub.text: ined again add esp, 8.text: (this is indicative of mov esp, ebp.text: cdecl) pop ebp.text: a retn eax ecx edx ebp esp 0x0012FF30 0x0012FF2C 0x0012FF28 0x0012FF24 0x0012FF20 0x0012FF1C 0x0012FF18 0x0012FF14 0x0012FF10 0x0012FF0C 0x100c (arbitraryz ) 0x12FFD4 0xfeed 0x0012FF24 0x0012FF20 0x12FFB0 (char ** argv) 0x2 (int argc) Addr after call _main 0x0012FF50 (saved ebp) 0xbabe (int a) c c 8/28/

64 Example2-7.text: _sub: push ebp.text: mov ebp, esp.text: mov eax, [ebp+8].text: mov ecx, [ebp+0ch].text: lea eax, [ecx+eax*2].text: c pop ebp.text: d retn.text: _main: push ebp.text: mov ebp, esp.text: push ecx.text: mov eax, [ebp+0ch].text: First setting a mov ecx, [eax+4].text: a equal to the return push ecx.text: b value. Then call dword ptr ds: imp atoi.text: pushing a as the add esp, 4.text: second parameter mov [ebp-4], eax x.text: in sub(). We can mov edx, [ebp-4] x.text: a see an obvious push edx x.text: b optimization would mov eax, [ebp+8].text: e have been to push eax.text: f replace the last two call _sub.text: instructions with add esp, 8.text: push eax. mov esp, ebp.text: pop ebp.text: a retn eax ecx edx ebp esp 0x0012FF30 0x0012FF2C 0x0012FF28 0x0012FF24 0x0012FF20 0x0012FF1C 0x0012FF18 0x0012FF14 0x0012FF10 0x0012FF0C 0x100 0x12FFD4 0x100 c 0x0012FF24 0x0012FF1C c 0x12FFB0 (char ** argv) 0x2 (int argc) Addr after call _main 0x0012FF50 (saved ebp) 0x100 (int a) c 0x100 (int y) c 8/28/

65 Example2-8.text: _sub: push ebp.text: mov ebp, esp.text: mov eax, [ebp+8].text: mov ecx, [ebp+0ch].text: lea eax, [ecx+eax*2].text: c pop ebp.text: d retn.text: _main: push ebp.text: mov ebp, esp.text: push ecx.text: mov eax, [ebp+0ch].text: mov ecx, [eax+4].text: a push ecx.text: b call dword ptr ds: imp atoi.text: add esp, 4.text: mov [ebp-4], eax.text: mov edx, [ebp-4].text: a push edx.text: b mov eax, [ebp+8] x.text: e Pushing argc push eax x.text: f as the first call _sub.text: add esp, 8 parameter (int.text: mov esp, ebp.text: x) to sub() pop ebp.text: a retn eax ecx edx ebp esp 0x0012FF30 0x0012FF2C 0x0012FF28 0x0012FF24 0x0012FF20 0x0012FF1C 0x0012FF18 0x0012FF14 0x0012FF10 0x0012FF0C 0x2 c 0x12FFD4 0x100 0x0012FF24 0x0012FF18 c 0x12FFB0 (char ** argv) 0x2 (int argc) Addr after call _main 0x0012FF50 (saved ebp) 0x100 (int a) 0x100 (int y) 0x2 (int x) c 8/28/

66 Example2-9.text: _sub: push ebp.text: mov ebp, esp.text: mov eax, [ebp+8].text: mov ecx, [ebp+0ch].text: lea eax, [ecx+eax*2].text: c pop ebp.text: d retn.text: _main: push ebp.text: mov ebp, esp.text: push ecx.text: mov eax, [ebp+0ch].text: mov ecx, [eax+4].text: a push ecx.text: b call dword ptr ds: imp atoi.text: add esp, 4.text: mov [ebp-4], eax.text: mov edx, [ebp-4].text: a push edx.text: b mov eax, [ebp+8].text: e push eax.text: f call _sub x.text: add esp, 8.text: mov esp, ebp.text: pop ebp.text: a retn eax ecx edx ebp esp 0x0012FF30 0x0012FF2C 0x0012FF28 0x0012FF24 0x0012FF20 0x0012FF1C 0x0012FF18 0x0012FF14 0x0012FF10 0x0012FF0C 0x2 0x12FFD4 0x100 0x0012FF24 0x0012FF14 c 0x12FFB0 (char ** argv) 0x2 (int argc) Addr after call _main 0x0012FF50 (saved ebp) 0x100 (int a) 0x100 (int y) 0x2 (int x) 0x c 8/28/

67 Example2-10.text: _sub: push ebp x.text: mov ebp, esp x.text: mov eax, [ebp+8].text: mov ecx, [ebp+0ch].text: lea eax, [ecx+eax*2].text: c pop ebp.text: d retn.text: _main: push ebp.text: mov ebp, esp.text: push ecx.text: mov eax, [ebp+0ch].text: mov ecx, [eax+4].text: a push ecx.text: b call dword ptr ds: imp atoi.text: add esp, 4.text: mov [ebp-4], eax.text: mov edx, [ebp-4].text: a push edx.text: b mov eax, [ebp+8].text: e push eax.text: f call _sub.text: add esp, 8.text: mov esp, ebp.text: pop ebp.text: a retn eax ecx edx ebp esp 0x0012FF30 0x0012FF2C 0x0012FF28 0x0012FF24 0x0012FF20 0x0012FF1C 0x0012FF18 0x0012FF14 0x0012FF10 0x0012FF0C 0x2 0x12FFD4 0x100 0x0012FF10 c 0x0012FF10 c 0x12FFB0 (char ** argv) 0x2 (int argc) Addr after call _main 0x0012FF50 (saved ebp) 0x100 (int a) 0x100 (int y) 0x2 (int x) 0x x0012FF24(saved ebp)c 8/28/

68 Example2-11.text: _sub: push ebp.text: mov ebp, esp.text: mov eax, [ebp+8] x.text: mov ecx, [ebp+0ch] x.text: Move x into eax, lea eax, [ecx+eax*2] and y into ecx..text: c pop ebp.text: d retn.text: _main: push ebp.text: mov ebp, esp.text: push ecx.text: mov eax, [ebp+0ch].text: mov ecx, [eax+4].text: a push ecx.text: b call dword ptr ds: imp atoi.text: add esp, 4.text: mov [ebp-4], eax.text: mov edx, [ebp-4].text: a push edx.text: b mov eax, [ebp+8].text: e push eax.text: f call _sub.text: add esp, 8.text: mov esp, ebp.text: pop ebp.text: a retn eax ecx edx ebp esp 0x0012FF30 0x0012FF2C 0x0012FF28 0x0012FF24 0x0012FF20 0x0012FF1C 0x0012FF18 0x0012FF14 0x0012FF10 0x0012FF0C 0x2 c (no value change) 0x100 c 0x100 0x0012FF10 0x0012FF10 0x12FFB0 (char ** argv) 0x2 (int argc) Addr after call _main 0x0012FF50 (saved ebp) 0x100 (int a) 0x100 (int y) 0x2 (int x) 0x x0012FF24 (saved ebp) 8/28/

69 Example2-12.text: _sub: push ebp.text: mov ebp, esp.text: mov eax, [ebp+8].text: mov ecx, [ebp+0ch].text: Set the return value lea eax, [ecx+eax*2] x.text: c (eax) to 2*x + y. pop ebp.text: d Note: neither retn.text: pointer arith, nor _main: an push ebp.text: address which mov ebp, esp.text: was loaded. Just an push ecx.text: afficient way to do a mov eax, [ebp+0ch].text: calculation. mov ecx, [eax+4].text: a push ecx.text: b call dword ptr ds: imp atoi.text: add esp, 4.text: mov [ebp-4], eax.text: mov edx, [ebp-4].text: a push edx.text: b mov eax, [ebp+8].text: e push eax.text: f call _sub.text: add esp, 8.text: mov esp, ebp.text: pop ebp.text: a retn eax ecx edx ebp esp 0x0012FF30 0x0012FF2C 0x0012FF28 0x0012FF24 0x0012FF20 0x0012FF1C 0x0012FF18 0x0012FF14 0x0012FF10 0x0012FF0C 0x104 c 0x100 0x100 0x0012FF10 0x0012FF10 0x12FFB0 (char ** argv) 0x2 (int argc) Addr after call _main 0x0012FF50 (saved ebp) 0x100 (int a) 0x100 (int y) 0x2 (int x) 0x x0012FF24 (saved ebp) 8/28/

70 Example2-13.text: _sub: push ebp.text: mov ebp, esp.text: mov eax, [ebp+8].text: mov ecx, [ebp+0ch].text: lea eax, [ecx+eax*2].text: c pop ebp x.text: d retn.text: _main: push ebp.text: mov ebp, esp.text: push ecx.text: mov eax, [ebp+0ch].text: mov ecx, [eax+4].text: a push ecx.text: b call dword ptr ds: imp atoi.text: add esp, 4.text: mov [ebp-4], eax.text: mov edx, [ebp-4].text: a push edx.text: b mov eax, [ebp+8].text: e push eax.text: f call _sub.text: add esp, 8.text: mov esp, ebp.text: pop ebp.text: a retn eax ecx edx ebp esp 0x0012FF30 0x0012FF2C 0x0012FF28 0x0012FF24 0x0012FF20 0x0012FF1C 0x0012FF18 0x0012FF14 0x0012FF10 0x0012FF0C 0x104 0x100 0x100 0x0012FF24 c 0x0012FF14 c 0x12FFB0 (char ** argv) 0x2 (int argc) Addr after call _main 0x0012FF50 (saved ebp) 0x100 (int a) 0x100 (int y) 0x2 (int x) 0x c 8/28/

71 Example2-14.text: _sub: push ebp.text: mov ebp, esp.text: mov eax, [ebp+8].text: mov ecx, [ebp+0ch].text: lea eax, [ecx+eax*2].text: c pop ebp.text: d retn x.text: _main: push ebp.text: mov ebp, esp.text: push ecx.text: mov eax, [ebp+0ch].text: mov ecx, [eax+4].text: a push ecx.text: b call dword ptr ds: imp atoi.text: add esp, 4.text: mov [ebp-4], eax.text: mov edx, [ebp-4].text: a push edx.text: b mov eax, [ebp+8].text: e push eax.text: f call _sub.text: add esp, 8.text: mov esp, ebp.text: pop ebp.text: a retn eax ecx edx ebp esp 0x0012FF30 0x0012FF2C 0x0012FF28 0x0012FF24 0x0012FF20 0x0012FF1C 0x0012FF18 0x0012FF14 0x0012FF10 0x0012FF0C 0x104 0x100 0x100 0x0012FF24 0x0012FF18 c 0x12FFB0 (char ** argv) 0x2 (int argc) Addr after call _main 0x0012FF50 (saved ebp) 0x100 (int a) 0x100 (int y) 0x2 (int x) c 8/28/

72 Example2-15.text: _sub: push ebp.text: mov ebp, esp.text: mov eax, [ebp+8].text: mov ecx, [ebp+0ch].text: lea eax, [ecx+eax*2].text: c pop ebp.text: d retn.text: _main: push ebp.text: mov ebp, esp.text: push ecx.text: mov eax, [ebp+0ch].text: mov ecx, [eax+4].text: a push ecx.text: b call dword ptr ds: imp atoi.text: add esp, 4.text: mov [ebp-4], eax.text: mov edx, [ebp-4].text: a push edx.text: b mov eax, [ebp+8].text: e push eax.text: f call _sub.text: add esp, 8 x.text: mov esp, ebp.text: pop ebp.text: a retn eax ecx edx ebp esp 0x0012FF30 0x0012FF2C 0x0012FF28 0x0012FF24 0x0012FF20 0x0012FF1C 0x0012FF18 0x0012FF14 0x0012FF10 0x0012FF0C 0x104 0x100 0x100 0x0012FF24 0x0012FF20 c 0x12FFB0 (char ** argv) 0x2 (int argc) Addr after call _main 0x0012FF50 (saved ebp) 0x100 (int a) c c 8/28/

73 Example2-16.text: _sub: push ebp.text: mov ebp, esp.text: mov eax, [ebp+8].text: mov ecx, [ebp+0ch].text: lea eax, [ecx+eax*2].text: c pop ebp.text: d retn.text: _main: push ebp.text: mov ebp, esp.text: push ecx.text: mov eax, [ebp+0ch].text: mov ecx, [eax+4].text: a push ecx.text: b call dword ptr ds: imp atoi.text: add esp, 4.text: mov [ebp-4], eax.text: mov edx, [ebp-4].text: a push edx.text: b mov eax, [ebp+8].text: e push eax.text: f call _sub.text: add esp, 8.text: mov esp, ebp x.text: pop ebp.text: a retn eax ecx edx ebp esp 0x0012FF30 0x0012FF2C 0x0012FF28 0x0012FF24 0x0012FF20 0x0012FF1C 0x0012FF18 0x0012FF14 0x0012FF10 0x0012FF0C 0x104 0x100 0x100 0x0012FF24 0x0012FF24 c 0x12FFB0 (char ** argv) 0x2 (int argc) Addr after call _main 0x0012FF50 (saved ebp) c 8/28/

74 Example2-17.text: _sub: push ebp.text: mov ebp, esp.text: mov eax, [ebp+8].text: mov ecx, [ebp+0ch].text: lea eax, [ecx+eax*2].text: c pop ebp.text: d retn.text: _main: push ebp.text: mov ebp, esp.text: push ecx.text: mov eax, [ebp+0ch].text: mov ecx, [eax+4].text: a push ecx.text: b call dword ptr ds: imp atoi.text: add esp, 4.text: mov [ebp-4], eax.text: mov edx, [ebp-4].text: a push edx.text: b mov eax, [ebp+8].text: e push eax.text: f call _sub.text: add esp, 8.text: mov esp, ebp.text: pop ebp x.text: a retn eax ecx edx ebp esp 0x0012FF30 0x0012FF2C 0x0012FF28 0x0012FF24 0x0012FF20 0x0012FF1C 0x0012FF18 0x0012FF14 0x0012FF10 0x0012FF0C 0x104 0x100 0x100 0x0012FF50 c 0x0012FF28 c 0x12FFB0 (char ** argv) 0x2 (int argc) Addr after call _main c 8/28/

75 This may be A good )me for a break Or Ques)ons! 8/28/

76 Control Flow Two forms of control flow Condi)onal - go somewhere if a condi)on is met. Think if s, switches, loops Uncondi)onal - go somewhere no majer what. Procedure calls, goto, excep)ons, interrupts. We ve already seen procedure calls manifest themselves as push/call/ret, let s see how goto manifests itself in asm. 8/28/

77 Example2.999repea)ng.c: //Goto example #include <stdio.h> int main(){ goto mylabel; printf("skipped\n"); mylabel: printf("goto ftw!\n"); return 0xf00d; } push ebp mov ebp,esp jmp push h A call dword ptr ds:[ h] add esp,4 mylabel: push 40500Ch call dword ptr ds:[ h] E add esp, mov eax,0f00dh pop ebp ret 8/28/

78 10 JMP - Jump Change eip to the given address Main forms of the address Short rela)ve (1 byte displacement from end of the instruc)on) jmp doesn t have the number anywhere in it, it s really jmp 0x0E bytes forward Some disassemblers will indicate this with a mnemonic by wri)ng it as jmp short Near rela)ve (4 byte displacement from current eip) Absolute (hardcoded address in instruc)on) Absolute Indirect (address calculated with r/m32) jmp - 2 == infinite loop for short rela)ve jmp :) 8/28/2015 Book p

79 Example3.c (Remain calm) int main(){ int a=1, b=2; if(a == b){ return 1; } if(a > b){ return 2; } if(a < b){ return 3; } return 0xdefea7; } 8/28/2015 Jcc main: push ebp mov ebp,esp sub esp, mov dword ptr [ebp-4], D mov dword ptr [ebp-8], mov eax,dword ptr [ebp-4] cmp eax,dword ptr [ebp-8] A jne C mov eax, jmp mov ecx,dword ptr [ebp-4] cmp ecx,dword ptr [ebp-8] jle B mov eax, jmp mov edx,dword ptr [ebp-4] cmp edx,dword ptr [ebp-8] jge A mov eax, F jmp mov eax,0defea7h mov esp,ebp pop ebp ret 79

80 Ghost of Xmas Future: Tools you won t get to use today generate a Control Flow Graph (CFG) which looks much nicer. Not that that helps you. Just sayin :) 8/28/

81 11 Jcc - Jump If Condition Is Met There are more than 4 pages of condi)onal jump types! Luckily a bunch of them are synonyms for each other. JNE == JNZ (Jump if not equal, Jump if not zero, both check if the Zero Flag (ZF) == 0) 8/28/2015 Book p

82 Some Notable Jcc Instruc)ons JZ/JE: if ZF == 1 JNZ/JNE: if ZF == 0 JLE/JNG : if ZF == 1 or SF!= OF JGE/JNL : if SF == OF JBE: if CF == 1 OR ZF == 1 JB: if CF == 1 Note: Don t get hung up on memorizing which flags are set for what. More olen than not, you will be running code in a debugger, not just reading it. In the debugger you can just look at eflags and/or watch whether it takes a jump. 8/28/

83 Flag se ng Before you can do a condi)onal jump, you need something to set the condi)on flags for you. Typically done with CMP, TEST, or whatever instruc)ons are already inline and happen to have flag- se ng side- effects 8/28/

84 12 CMP - Compare Two Operands The comparison is performed by subtracting the second operand from the first operand and then setting the status flags in the same manner as the SUB instruction. What s the difference from just doing SUB? Difference is that with SUB the result has to be stored somewhere. With CMP the result is computed, the flags are set, but the result is discarded. Thus this only sets flags and doesn t mess up any of your registers. Modifies CF, OF, SF, ZF, AF, and PF (implies that SUB modifies all those too) 8/28/2015 Book p

85 13 TEST - Logical Compare Computes the bit-wise logical AND of first operand (source 1 operand) and the second operand (source 2 operand) and sets the SF, ZF, and PF status flags according to the result. Like CMP - sets flags, and throws away the result 8/28/2015 Book p

86 Example4.c #define MASK 0x100 int main(){ int a=0x1301; if(a & MASK){ return 1; jcc } else{ return 2; } } Eventually found out 8/28/2015 why there are 2 jmps! (no optimization, so simple compiler rules) main: push ebp mov ebp,esp push ecx mov dword ptr [ebp-4],1301h B mov eax,dword ptr [ebp-4] E and eax,100h je E mov eax, A jmp C jmp E mov eax, mov esp,ebp pop ebp ret I actually expected a TEST, because the result isn't stored 86

87 Refresher - Boolean ( bitwise ) logic AND & OR XOR ^ Operands Result NOT ~ 0 1 8/28/

88 14 AND - Logical AND Des)na)on operand can be r/m32 or register Source operand can be r/m32 or register or immediate (No source and des)na)on as r/m32s) and al, bl b (al - 0x33) AND b (bl - 0x55) result b (al - 0x11) and al, 0x b (al - 0x33) AND b (imm - 0x42) result b (al - 0x02) 8/28/2015 Book p

89 15 OR - Logical Inclusive OR Des)na)on operand can be r/m32 or register Source operand can be r/m32 or register or immediate (No source and des)na)on as r/m32s) or al, bl b (al - 0x33) OR b (bl - 0x55) result b (al - 0x77) or al, 0x b (al - 0x33) OR b (imm - 0x42) result b (al - 0x73) 8/28/2015 Book p

90 16 XOR - Logical Exclusive OR Des)na)on operand can be r/m32 or register Source operand can be r/m32 or register or immediate (No source and des)na)on as r/m32s) xor al, al b (al - 0x33) XOR b (al - 0x33) result b (al - 0x00) xor al, 0x b (al - 0x33) OR b (imm - 0x42) result b (al - 0x71) XOR is commonly used to zero a register, by XORing it with itself, because 8/28/2015 it s faster than a MOV Book p

91 17 NOT - One's Complement Negation Single source/des)na)on operand can be r/ m32 not al NOT b (al - 0x33) al not [al+bl] 0x result b (al - 0xCC) bl 0x al+bl 0x Xeno trying to be clever on a boring example, and failing 8/28/2015 Book p. 231 [al+bl] 0 (assumed memory at 0x ) NOT b result b 91

92 Example5.c - simple for loop #include <stdio.h> int main(){ int i; for(i = 0; i < 10; i++){ printf("i = %d\n, i); } } What does this add say about the calling convention of printf()? Interesting note: Defaults 8/28/2015 to returning 0 main: push ebp mov ebp,esp push ecx mov dword ptr [ebp-4], B jmp D mov eax,dword ptr [ebp-4] add eax, mov dword ptr [ebp-4],eax cmp dword ptr [ebp-4],0ah A jge C mov ecx,dword ptr [ebp-4] F push ecx push h call dword ptr ds:[ h] B add esp, E jmp D xor eax,eax mov esp,ebp pop ebp ret 92

93 Instruc)ons we now know(17) NOP PUSH/POP CALL/RET MOV/LEA ADD/SUB JMP/Jcc CMP/TEST AND/OR/XOR/NOT 8/28/

94 Example6.c //Multiply and divide transformations //New instructions: //shl - Shift Left, shr - Shift Right int main(){ unsigned int a, b, c; a = 0x40; b = a * 8; c = b / 16; return c; } 8/28/2015 main: push mov sub mov mov shl mov mov shr mov mov mov pop ret ebp ebp,esp esp,0ch dword ptr [ebp-4],40h eax,dword ptr [ebp-4] eax,3 dword ptr [ebp-8],eax ecx,dword ptr [ebp-8] ecx,4 dword ptr [ebp-0ch],ecx eax,dword ptr [ebp-0ch] esp,ebp ebp 94

95 18 SHL - Shift Logical Left Book p. 224 Can be explicitly used with the C << operator First operand (source and des)na)on) operand is an r/m32 Second operand is either cl (lowest byte of ecx), or a 1 byte immediate. The 2nd operand is the number of places to shil. It mul$plies the register by 2 for each place the value is shiled. More efficient than a mul)ply instruc)on. Bits shiled off the lel hand side are shiled into (set) the carry flag (CF) For purposes of determining if the CF is set at the end, think of it as n independent 1 bit shils. shl cl, b (cl - 0x33) result 8/28/ b (cl - 0xCC) CF = 0 shl cl, b (cl - 0x33) result b (cl - 0x98) CF = 1 95

96 19 SHR - Shift Logical Right Book p. 225 Can be explicitly used with the C >> operator First operand (source and des)na)on) operand is an r/m32 Second operand is either cl (lowest byte of ecx), or a 1 byte immediate. The 2nd operand is the number of places to shil. It divides the register by 2 for each place the value is shiled. More efficient than a mul)ply instruc)on. Bits shiled off the right hand side are shiled into (set) the carry flag (CF) For purposes of determining if the CF is set at the end, think of it as n independent 1 bit shils. shr cl, b (cl - 0x33) result 8/28/ b (cl - 0x0C) CF = 1 shr cl, b (cl - 0x33) result b (cl - 0x06) CF = 0 96

97 Example7.c //Multiply and divide operations //when the operand is not a //power of two //New instructions: imul, div int main(){ unsigned int a = 1; a = a * 6; a = a / 3; return 0x2bad; } 8/28/2015 main: push mov push mov mov imul mov mov xor mov div mov mov mov pop ret ebp ebp,esp ecx dword ptr [ebp-4],1 eax,dword ptr [ebp-4] eax,eax,6 dword ptr [ebp-4],eax eax,dword ptr [ebp-4] edx,edx ecx,3 eax,ecx dword ptr [ebp-4],eax eax,2badh esp,ebp ebp 97

98 20 IMUL - Signed Multiply Book p. 218 Wait what? Weren t the operands unsigned? Visual Studio seems to have a predilec)on for imul over mul (unsigned mul)ply). I haven t been able to get it to generate the lajer for simple examples. Three forms. One, two, or three operands imul r/m32 edx:eax = eax * r/m32 imul reg, r/m32 reg = reg * r/m32 imul reg, r/m32, immediate reg = r/m32 * immediate Three operands? Only one of it s kind?(see link in notes) initial edx eax r/m32(ecx) 0x0 0x x4 eax 0x20 r/m32(ecx) 0x4 eax 0x20 r/m32(ecx) 0x4 operation imul ecx imul eax, ecx imul eax, ecx, 0x6 result edx eax r/m32(ecx) eax r/m32(ecx) eax r/m32(ecx) 8/28/2015 0x1 0x x4 0x80 0x4 0x18 0x4 98

99 21 DIV - Unsigned Divide Book p. 221 Two forms Unsigned divide ax by r/m8, al = quo)ent, ah = remainder Unsigned divide edx:eax by r/m32, eax = quo)ent, edx = remainder If dividend is 32bits, edx will just be set to 0 before the instruc)on (as occurred in the Example7.c code) If the divisor is 0, a divide by zero excep)on is raised. initial ax 0x8 r/m8(cx) 0x3 edx eax r/m32(ecx) 0x0 0x8 0x3 operation div ax, cx div eax, ecx result 8/28/2015 ah 0x2 al 0x2 edx eax r/m32(ecx) 0x1 0x2 0x3 99

100 Example8.c //VisualStudio runtime check //buffer initialization //auto-generated code //New instruction: rep stos int main(){ char buf[40]; buf[39] = 42; return 0xb100d; } 8/28/

101 8/28/2015 Example8.c main: push ebp mov ebp,esp sub esp,30h push edi lea edi,[ebp-30h] A mov ecx,0ch F mov eax,0cccccccch rep stos dword ptr es:[edi] mov byte ptr [ebp-5],2ah A mov eax,0b100dh F push edx mov ecx,ebp push eax lea edx,[ (401048h)] call _RTC_CheckStackVars (4010B0h) E pop eax F pop edx pop edi mov esp,ebp pop ebp ret 101

102 22 REP STOS - Repeat Store String One of a family of rep opera)ons, which repeat a single instruc)on mul)ple )mes. (i.e. stos is also a standalone instruc)on) Rep isn t technically it s own instruc)on, it s an instruc)on prefix All rep opera)ons use ecx register as a counter to determine how many )mes to loop through the instruc)on. Each )me it executes, it decrements ecx. Once ecx == 0, it con)nues to the next instruc)on. Either moves one byte at a )me or one dword at a )me. Either fill byte at [edi] with al or fill dword at [edi] with eax. Moves the edi register forward one byte or one dword at a )me, so that the repeated store opera)on is storing into consecu)ve loca)ons. So there are 3 pieces which must happen before the actual rep stos occurs: set edi to the start des)na)on, eax/al to the value to store, and ecx to the number of )mes to store 8/28/2015 Book p

103 rep stos setup AC lea edi,[ebp- 0F0h] Set edi - the des$na$on B2 mov Set ecx - the count B7 mov Set eax - the value ecx,3ch eax,0cccccccch BC rep stos dword ptr es:[edi] Start the repeated store So what's this going to do? Store 0x3C copies of the dword 0xCCCCCCCC star)ng at ebp- 0xF0 And that just happens to be 0xF0 bytes of 0xCC! 8/28/

104 Q: Where does the rep stos come from in this example? A: Compiler-auto-generated code. From the stack frames runtime check option. This is enabled by default in the debug build. Disabling this option removes the compiler-generated code. 8/28/

Lab 3. The Art of Assembly Language (II)

Lab 3. The Art of Assembly Language (II) Lab. The Art of Assembly Language (II) Dan Bruce, David Clark and Héctor D. Menéndez Department of Computer Science University College London October 2, 2017 License Creative Commons Share Alike Modified

More information

Practical Malware Analysis

Practical Malware Analysis Practical Malware Analysis Ch 4: A Crash Course in x86 Disassembly Revised 1-16-7 Basic Techniques Basic static analysis Looks at malware from the outside Basic dynamic analysis Only shows you how the

More information

CNIT 127: Exploit Development. Ch 1: Before you begin. Updated

CNIT 127: Exploit Development. Ch 1: Before you begin. Updated CNIT 127: Exploit Development Ch 1: Before you begin Updated 1-14-16 Basic Concepts Vulnerability A flaw in a system that allows an attacker to do something the designer did not intend, such as Denial

More information

X86 Addressing Modes Chapter 3" Review: Instructions to Recognize"

X86 Addressing Modes Chapter 3 Review: Instructions to Recognize X86 Addressing Modes Chapter 3" Review: Instructions to Recognize" 1 Arithmetic Instructions (1)! Two Operand Instructions" ADD Dest, Src Dest = Dest + Src SUB Dest, Src Dest = Dest - Src MUL Dest, Src

More information

CSC 8400: Computer Systems. Machine-Level Representation of Programs

CSC 8400: Computer Systems. Machine-Level Representation of Programs CSC 8400: Computer Systems Machine-Level Representation of Programs Towards the Hardware High-level language (Java) High-level language (C) assembly language machine language (IA-32) 1 Compilation Stages

More information

CSC 2400: Computer Systems. Towards the Hardware: Machine-Level Representation of Programs

CSC 2400: Computer Systems. Towards the Hardware: Machine-Level Representation of Programs CSC 2400: Computer Systems Towards the Hardware: Machine-Level Representation of Programs Towards the Hardware High-level language (Java) High-level language (C) assembly language machine language (IA-32)

More information

Program Exploitation Intro

Program Exploitation Intro Program Exploitation Intro x86 Assembly 04//2018 Security 1 Univeristà Ca Foscari, Venezia What is Program Exploitation "Making a program do something unexpected and not planned" The right bugs can be

More information

Reverse Engineering Low Level Software. CS5375 Software Reverse Engineering Dr. Jaime C. Acosta

Reverse Engineering Low Level Software. CS5375 Software Reverse Engineering Dr. Jaime C. Acosta 1 Reverse Engineering Low Level Software CS5375 Software Reverse Engineering Dr. Jaime C. Acosta Machine code 2 3 Machine code Assembly compile Machine Code disassemble 4 Machine code Assembly compile

More information

CSE P 501 Compilers. x86 Lite for Compiler Writers Hal Perkins Autumn /25/ Hal Perkins & UW CSE J-1

CSE P 501 Compilers. x86 Lite for Compiler Writers Hal Perkins Autumn /25/ Hal Perkins & UW CSE J-1 CSE P 501 Compilers x86 Lite for Compiler Writers Hal Perkins Autumn 2011 10/25/2011 2002-11 Hal Perkins & UW CSE J-1 Agenda Learn/review x86 architecture Core 32-bit part only for now Ignore crufty, backward-compatible

More information

Reverse Engineering II: Basics. Gergely Erdélyi Senior Antivirus Researcher

Reverse Engineering II: Basics. Gergely Erdélyi Senior Antivirus Researcher Reverse Engineering II: Basics Gergely Erdélyi Senior Antivirus Researcher Agenda Very basics Intel x86 crash course Basics of C Binary Numbers Binary Numbers 1 Binary Numbers 1 0 1 1 Binary Numbers 1

More information

Introduction to Intel x86-64 Assembly, Architecture, Applications, & Alliteration. Xeno Kovah 2014 xkovah at gmail

Introduction to Intel x86-64 Assembly, Architecture, Applications, & Alliteration. Xeno Kovah 2014 xkovah at gmail Introduction to Intel x86-64 Assembly, Architecture, Applications, & Alliteration Xeno Kovah 2014 xkovah at gmail All materials is licensed under a Creative Commons Share Alike license. http://creativecommons.org/licenses/by-sa/3.0/

More information

Reverse Engineering II: The Basics

Reverse Engineering II: The Basics Reverse Engineering II: The Basics Gergely Erdélyi Senior Manager, Anti-malware Research Protecting the irreplaceable f-secure.com Binary Numbers 1 0 1 1 - Nibble B 1 0 1 1 1 1 0 1 - Byte B D 1 0 1 1 1

More information

Lecture 2 Assembly Language

Lecture 2 Assembly Language Lecture 2 Assembly Language Computer and Network Security 9th of October 2017 Computer Science and Engineering Department CSE Dep, ACS, UPB Lecture 2, Assembly Language 1/37 Recap: Explorations Tools assembly

More information

Reverse Engineering II: The Basics

Reverse Engineering II: The Basics Reverse Engineering II: The Basics This document is only to be distributed to teachers and students of the Malware Analysis and Antivirus Technologies course and should only be used in accordance with

More information

Lecture 15 Intel Manual, Vol. 1, Chapter 3. Fri, Mar 6, Hampden-Sydney College. The x86 Architecture. Robb T. Koether. Overview of the x86

Lecture 15 Intel Manual, Vol. 1, Chapter 3. Fri, Mar 6, Hampden-Sydney College. The x86 Architecture. Robb T. Koether. Overview of the x86 Lecture 15 Intel Manual, Vol. 1, Chapter 3 Hampden-Sydney College Fri, Mar 6, 2009 Outline 1 2 Overview See the reference IA-32 Intel Software Developer s Manual Volume 1: Basic, Chapter 3. Instructions

More information

Rev101. spritzers - CTF team. spritz.math.unipd.it/spritzers.html

Rev101. spritzers - CTF team. spritz.math.unipd.it/spritzers.html Rev101 spritzers - CTF team spritz.math.unipd.it/spritzers.html Disclaimer All information presented here has the only purpose of teaching how reverse engineering works. Use your mad skillz only in CTFs

More information

Reading assignment. Chapter 3.1, 3.2 Chapter 4.1, 4.3

Reading assignment. Chapter 3.1, 3.2 Chapter 4.1, 4.3 Reading assignment Chapter 3.1, 3.2 Chapter 4.1, 4.3 1 Outline Introduc5on to assembly programing Introduc5on to Y86 Y86 instruc5ons, encoding and execu5on 2 Assembly The CPU uses machine language to perform

More information

administrivia today start assembly probably won t finish all these slides Assignment 4 due tomorrow any questions?

administrivia today start assembly probably won t finish all these slides Assignment 4 due tomorrow any questions? administrivia today start assembly probably won t finish all these slides Assignment 4 due tomorrow any questions? exam on Wednesday today s material not on the exam 1 Assembly Assembly is programming

More information

The x86 Architecture

The x86 Architecture The x86 Architecture Lecture 24 Intel Manual, Vol. 1, Chapter 3 Robb T. Koether Hampden-Sydney College Fri, Mar 20, 2015 Robb T. Koether (Hampden-Sydney College) The x86 Architecture Fri, Mar 20, 2015

More information

x86 assembly CS449 Fall 2017

x86 assembly CS449 Fall 2017 x86 assembly CS449 Fall 2017 x86 is a CISC CISC (Complex Instruction Set Computer) e.g. x86 Hundreds of (complex) instructions Only a handful of registers RISC (Reduced Instruction Set Computer) e.g. MIPS

More information

CS 31: Intro to Systems ISAs and Assembly. Kevin Webb Swarthmore College February 9, 2016

CS 31: Intro to Systems ISAs and Assembly. Kevin Webb Swarthmore College February 9, 2016 CS 31: Intro to Systems ISAs and Assembly Kevin Webb Swarthmore College February 9, 2016 Reading Quiz Overview How to directly interact with hardware Instruction set architecture (ISA) Interface between

More information

CS61 Section Solutions 3

CS61 Section Solutions 3 CS61 Section Solutions 3 (Week of 10/1-10/5) 1. Assembly Operand Specifiers 2. Condition Codes 3. Jumps 4. Control Flow Loops 5. Procedure Calls 1. Assembly Operand Specifiers Q1 Operand Value %eax 0x104

More information

Assembly Language Programming: Procedures. EECE416 uc. Charles Kim Howard University. Fall

Assembly Language Programming: Procedures. EECE416 uc. Charles Kim Howard University. Fall Assembly Language Programming: Procedures EECE416 uc Charles Kim Howard University Fall 2013 www.mwftr.com Before we start Schedule of the next few weeks T Nov 19: Procedure and Calls (continued) R Nov

More information

CS 31: Intro to Systems ISAs and Assembly. Kevin Webb Swarthmore College September 25, 2018

CS 31: Intro to Systems ISAs and Assembly. Kevin Webb Swarthmore College September 25, 2018 CS 31: Intro to Systems ISAs and Assembly Kevin Webb Swarthmore College September 25, 2018 Overview How to directly interact with hardware Instruction set architecture (ISA) Interface between programmer

More information

CS412/CS413. Introduction to Compilers Tim Teitelbaum. Lecture 21: Generating Pentium Code 10 March 08

CS412/CS413. Introduction to Compilers Tim Teitelbaum. Lecture 21: Generating Pentium Code 10 March 08 CS412/CS413 Introduction to Compilers Tim Teitelbaum Lecture 21: Generating Pentium Code 10 March 08 CS 412/413 Spring 2008 Introduction to Compilers 1 Simple Code Generation Three-address code makes it

More information

CSE2421 FINAL EXAM SPRING Name KEY. Instructions: Signature

CSE2421 FINAL EXAM SPRING Name KEY. Instructions: Signature CSE2421 FINAL EXAM SPRING 2013 Name KEY Instructions: This is a closed-book, closed-notes, closed-neighbor exam. Only a writing utensil is needed for this exam. No calculators allowed. If you need to go

More information

Computer Architecture and Assembly Language. Practical Session 3

Computer Architecture and Assembly Language. Practical Session 3 Computer Architecture and Assembly Language Practical Session 3 Advanced Instructions division DIV r/m - unsigned integer division IDIV r/m - signed integer division Dividend Divisor Quotient Remainder

More information

Introduction to Intel x86-64 Assembly, Architecture, Applications, & Alliteration. Xeno Kovah

Introduction to Intel x86-64 Assembly, Architecture, Applications, & Alliteration. Xeno Kovah Introduction to Intel x86-64 Assembly, Architecture, Applications, & Alliteration Xeno Kovah 2014-2015 xeno@legbacore.com All materials is licensed under a Creative Commons Share Alike license. http://creativecommons.org/licenses/by-sa/3.0/

More information

Basic Pentium Instructions. October 18

Basic Pentium Instructions. October 18 Basic Pentium Instructions October 18 CSC201 Section 002 Fall, 2000 The EFLAGS Register Bit 11 = Overflow Flag Bit 7 = Sign Flag Bit 6 = Zero Flag Bit 0 = Carry Flag "Sets the flags" means sets OF, ZF,

More information

CSE351 Spring 2018, Midterm Exam April 27, 2018

CSE351 Spring 2018, Midterm Exam April 27, 2018 CSE351 Spring 2018, Midterm Exam April 27, 2018 Please do not turn the page until 11:30. Last Name: First Name: Student ID Number: Name of person to your left: Name of person to your right: Signature indicating:

More information

Winter Compiler Construction T11 Activation records + Introduction to x86 assembly. Today. Tips for PA4. Today:

Winter Compiler Construction T11 Activation records + Introduction to x86 assembly. Today. Tips for PA4. Today: Winter 2006-2007 Compiler Construction T11 Activation records + Introduction to x86 assembly Mooly Sagiv and Roman Manevich School of Computer Science Tel-Aviv University Today ic IC Language Lexical Analysis

More information

CS24: INTRODUCTION TO COMPUTING SYSTEMS. Spring 2016 Lecture 12

CS24: INTRODUCTION TO COMPUTING SYSTEMS. Spring 2016 Lecture 12 CS24: INTRODUCTION TO COMPUTING SYSTEMS Spring 2016 Lecture 12 CS24 MIDTERM Midterm format: 6 hour overall time limit, multiple sittings (If you are focused on midterm, clock should be running.) Open book

More information

Stack -- Memory which holds register contents. Will keep the EIP of the next address after the call

Stack -- Memory which holds register contents. Will keep the EIP of the next address after the call Call without Parameter Value Transfer What are involved? ESP Stack Pointer Register Grows by 4 for EIP (return address) storage Stack -- Memory which holds register contents Will keep the EIP of the next

More information

complement) Multiply Unsigned: MUL (all operands are nonnegative) AX = BH * AL IMUL BH IMUL CX (DX,AX) = CX * AX Arithmetic MUL DWORD PTR [0x10]

complement) Multiply Unsigned: MUL (all operands are nonnegative) AX = BH * AL IMUL BH IMUL CX (DX,AX) = CX * AX Arithmetic MUL DWORD PTR [0x10] The following pages contain references for use during the exam: tables containing the x86 instruction set (covered so far) and condition codes. You do not need to submit these pages when you finish your

More information

An Introduction to x86 ASM

An Introduction to x86 ASM An Introduction to x86 ASM Malware Analysis Seminar Meeting 1 Cody Cutler, Anton Burtsev Registers General purpose EAX, EBX, ECX, EDX ESI, EDI (index registers, but used as general in 32-bit protected

More information

Instruction Set Architecture

Instruction Set Architecture CS:APP Chapter 4 Computer Architecture Instruction Set Architecture Randal E. Bryant Carnegie Mellon University http://csapp.cs.cmu.edu CS:APP Instruction Set Architecture Assembly Language View! Processor

More information

CPS104 Recitation: Assembly Programming

CPS104 Recitation: Assembly Programming CPS104 Recitation: Assembly Programming Alexandru Duțu 1 Facts OS kernel and embedded software engineers use assembly for some parts of their code some OSes had their entire GUIs written in assembly in

More information

Instruction Set Architecture

Instruction Set Architecture CS:APP Chapter 4 Computer Architecture Instruction Set Architecture Randal E. Bryant Carnegie Mellon University http://csapp.cs.cmu.edu CS:APP Instruction Set Architecture Assembly Language View Processor

More information

Machine-Level Programming II: Control and Arithmetic

Machine-Level Programming II: Control and Arithmetic Machine-Level Programming II: Control and Arithmetic CSCI 2400: Computer Architecture Instructor: David Ferry Slides adapted from Bryant & O Hallaron s slides 1 Today Complete addressing mode, address

More information

Second Part of the Course

Second Part of the Course CSC 2400: Computer Systems Towards the Hardware 1 Second Part of the Course Toward the hardware High-level language (C) assembly language machine language (IA-32) 2 High-Level Language g Make programming

More information

16.317: Microprocessor Systems Design I Fall 2014

16.317: Microprocessor Systems Design I Fall 2014 16.317: Microprocessor Systems Design I Fall 2014 Exam 2 Solution 1. (16 points, 4 points per part) Multiple choice For each of the multiple choice questions below, clearly indicate your response by circling

More information

Assembly Language: IA-32 Instructions

Assembly Language: IA-32 Instructions Assembly Language: IA-32 Instructions 1 Goals of this Lecture Help you learn how to: Manipulate data of various sizes Leverage more sophisticated addressing modes Use condition codes and jumps to change

More information

CS165 Computer Security. Understanding low-level program execution Oct 1 st, 2015

CS165 Computer Security. Understanding low-level program execution Oct 1 st, 2015 CS165 Computer Security Understanding low-level program execution Oct 1 st, 2015 A computer lets you make more mistakes faster than any invention in human history - with the possible exceptions of handguns

More information

Y86 Processor State. Instruction Example. Encoding Registers. Lecture 7A. Computer Architecture I Instruction Set Architecture Assembly Language View

Y86 Processor State. Instruction Example. Encoding Registers. Lecture 7A. Computer Architecture I Instruction Set Architecture Assembly Language View Computer Architecture I Instruction Set Architecture Assembly Language View Processor state Registers, memory, Instructions addl, movl, andl, How instructions are encoded as bytes Layer of Abstraction

More information

Dr. Ramesh K. Karne Department of Computer and Information Sciences, Towson University, Towson, MD /12/2014 Slide 1

Dr. Ramesh K. Karne Department of Computer and Information Sciences, Towson University, Towson, MD /12/2014 Slide 1 Dr. Ramesh K. Karne Department of Computer and Information Sciences, Towson University, Towson, MD 21252 rkarne@towson.edu 11/12/2014 Slide 1 Intel x86 Aseembly Language Assembly Language Assembly Language

More information

A CRASH COURSE IN X86 DISASSEMBLY

A CRASH COURSE IN X86 DISASSEMBLY A CRASH COURSE IN X86 DISASSEMBLY As discussed in previous chapters, basic static and dynamic malware analysis methods are good for initial triage, but they do not provide enough information to analyze

More information

Introduction to Reverse Engineering. Alan Padilla, Ricardo Alanis, Stephen Ballenger, Luke Castro, Jake Rawlins

Introduction to Reverse Engineering. Alan Padilla, Ricardo Alanis, Stephen Ballenger, Luke Castro, Jake Rawlins Introduction to Reverse Engineering Alan Padilla, Ricardo Alanis, Stephen Ballenger, Luke Castro, Jake Rawlins Reverse Engineering (of Software) What is it? What is it for? Binary exploitation (the cool

More information

CS 31: Intro to Systems ISAs and Assembly. Martin Gagné Swarthmore College February 7, 2017

CS 31: Intro to Systems ISAs and Assembly. Martin Gagné Swarthmore College February 7, 2017 CS 31: Intro to Systems ISAs and Assembly Martin Gagné Swarthmore College February 7, 2017 ANNOUNCEMENT All labs will meet in SCI 252 (the robot lab) tomorrow. Overview How to directly interact with hardware

More information

IA-32 Architecture. CS 4440/7440 Malware Analysis and Defense

IA-32 Architecture. CS 4440/7440 Malware Analysis and Defense IA-32 Architecture CS 4440/7440 Malware Analysis and Defense Intel x86 Architecture } Security professionals constantly analyze assembly language code } Many exploits are written in assembly } Source code

More information

Low-Level Essentials for Understanding Security Problems Aurélien Francillon

Low-Level Essentials for Understanding Security Problems Aurélien Francillon Low-Level Essentials for Understanding Security Problems Aurélien Francillon francill@eurecom.fr Computer Architecture The modern computer architecture is based on Von Neumann Two main parts: CPU (Central

More information

Module 3 Instruction Set Architecture (ISA)

Module 3 Instruction Set Architecture (ISA) Module 3 Instruction Set Architecture (ISA) I S A L E V E L E L E M E N T S O F I N S T R U C T I O N S I N S T R U C T I O N S T Y P E S N U M B E R O F A D D R E S S E S R E G I S T E R S T Y P E S O

More information

Function Calls COS 217. Reading: Chapter 4 of Programming From the Ground Up (available online from the course Web site)

Function Calls COS 217. Reading: Chapter 4 of Programming From the Ground Up (available online from the course Web site) Function Calls COS 217 Reading: Chapter 4 of Programming From the Ground Up (available online from the course Web site) 1 Goals of Today s Lecture Finishing introduction to assembly language o EFLAGS register

More information

Computer Systems Organization V Fall 2009

Computer Systems Organization V Fall 2009 Computer Systems Organization V22.0201 Fall 2009 Sample Midterm Exam ANSWERS 1. True/False. Circle the appropriate choice. (a) T (b) F At most one operand of an x86 assembly instruction can be an memory

More information

Process Layout and Function Calls

Process Layout and Function Calls Process Layout and Function Calls CS 6 Spring 07 / 8 Process Layout in Memory Stack grows towards decreasing addresses. is initialized at run-time. Heap grow towards increasing addresses. is initialized

More information

CS241 Computer Organization Spring 2015 IA

CS241 Computer Organization Spring 2015 IA CS241 Computer Organization Spring 2015 IA-32 2-10 2015 Outline! Review HW#3 and Quiz#1! More on Assembly (IA32) move instruction (mov) memory address computation arithmetic & logic instructions (add,

More information

Scott M. Lewandowski CS295-2: Advanced Topics in Debugging September 21, 1998

Scott M. Lewandowski CS295-2: Advanced Topics in Debugging September 21, 1998 Scott M. Lewandowski CS295-2: Advanced Topics in Debugging September 21, 1998 Assembler Syntax Everything looks like this: label: instruction dest,src instruction label Comments: comment $ This is a comment

More information

Instruction Set Architecture

Instruction Set Architecture CISC 360 Instruction Set Architecture Michela Taufer October 9, 2008 Powerpoint Lecture Notes for Computer Systems: A Programmer's Perspective, R. Bryant and D. O'Hallaron, Prentice Hall, 2003 Chapter

More information

Sungkyunkwan University

Sungkyunkwan University - 2 - Complete addressing mode, address computation (leal) Arithmetic operations Control: Condition codes Conditional branches While loops - 3 - Most General Form D(Rb,Ri,S) Mem[ Reg[ R b ] + S Reg[ R

More information

CISC 360 Instruction Set Architecture

CISC 360 Instruction Set Architecture CISC 360 Instruction Set Architecture Michela Taufer October 9, 2008 Powerpoint Lecture Notes for Computer Systems: A Programmer's Perspective, R. Bryant and D. O'Hallaron, Prentice Hall, 2003 Chapter

More information

System calls and assembler

System calls and assembler System calls and assembler Michal Sojka sojkam1@fel.cvut.cz ČVUT, FEL License: CC-BY-SA 4.0 System calls (repetition from lectures) A way for normal applications to invoke operating system (OS) kernel's

More information

SOEN228, Winter Revision 1.2 Date: October 25,

SOEN228, Winter Revision 1.2 Date: October 25, SOEN228, Winter 2003 Revision 1.2 Date: October 25, 2003 1 Contents Flags Mnemonics Basic I/O Exercises Overview of sample programs 2 Flag Register The flag register stores the condition flags that retain

More information

CS429: Computer Organization and Architecture

CS429: Computer Organization and Architecture CS429: Computer Organization and Architecture Warren Hunt, Jr. and Bill Young Department of Computer Sciences University of Texas at Austin Last updated: October 1, 2014 at 12:03 CS429 Slideset 6: 1 Topics

More information

EECE.3170: Microprocessor Systems Design I Summer 2017 Homework 4 Solution

EECE.3170: Microprocessor Systems Design I Summer 2017 Homework 4 Solution 1. (40 points) Write the following subroutine in x86 assembly: Recall that: int f(int v1, int v2, int v3) { int x = v1 + v2; urn (x + v3) * (x v3); Subroutine arguments are passed on the stack, and can

More information

Computer Architecture and System Programming Laboratory. TA Session 3

Computer Architecture and System Programming Laboratory. TA Session 3 Computer Architecture and System Programming Laboratory TA Session 3 Stack - LIFO word-size data structure STACK is temporary storage memory area register points on top of stack (by default, it is highest

More information

The IA-32 Stack and Function Calls. CS4379/5375 Software Reverse Engineering Dr. Jaime C. Acosta

The IA-32 Stack and Function Calls. CS4379/5375 Software Reverse Engineering Dr. Jaime C. Acosta 1 The IA-32 Stack and Function Calls CS4379/5375 Software Reverse Engineering Dr. Jaime C. Acosta 2 Important Registers used with the Stack EIP: ESP: EBP: 3 Important Registers used with the Stack EIP:

More information

16.317: Microprocessor Systems Design I Fall 2015

16.317: Microprocessor Systems Design I Fall 2015 16.317: Microprocessor Systems Design I Fall 2015 Exam 2 Solution 1. (16 points, 4 points per part) Multiple choice For each of the multiple choice questions below, clearly indicate your response by circling

More information

CMSC 313 Lecture 07. Short vs Near Jumps Logical (bit manipulation) Instructions AND, OR, NOT, SHL, SHR, SAL, SAR, ROL, ROR, RCL, RCR

CMSC 313 Lecture 07. Short vs Near Jumps Logical (bit manipulation) Instructions AND, OR, NOT, SHL, SHR, SAL, SAR, ROL, ROR, RCL, RCR CMSC 313 Lecture 07 Short vs Near Jumps Logical (bit manipulation) Instructions AND, OR, NOT, SHL, SHR, SAL, SAR, ROL, ROR, RCL, RCR More Arithmetic Instructions NEG, MUL, IMUL, DIV Indexed Addressing:

More information

Binghamton University. CS-220 Spring x86 Assembler. Computer Systems: Sections

Binghamton University. CS-220 Spring x86 Assembler. Computer Systems: Sections x86 Assembler Computer Systems: Sections 3.1-3.5 Disclaimer I am not an x86 assembler expert. I have never written an x86 assembler program. (I am proficient in IBM S/360 Assembler and LC3 Assembler.)

More information

CS24: INTRODUCTION TO COMPUTING SYSTEMS. Spring 2018 Lecture 4

CS24: INTRODUCTION TO COMPUTING SYSTEMS. Spring 2018 Lecture 4 CS24: INTRODUCTION TO COMPUTING SYSTEMS Spring 2018 Lecture 4 LAST TIME Enhanced our processor design in several ways Added branching support Allows programs where work is proportional to the input values

More information

Computer Systems Lecture 9

Computer Systems Lecture 9 Computer Systems Lecture 9 CPU Registers in x86 CPU status flags EFLAG: The Flag register holds the CPU status flags The status flags are separate bits in EFLAG where information on important conditions

More information

Machine-level Representation of Programs. Jin-Soo Kim Computer Systems Laboratory Sungkyunkwan University

Machine-level Representation of Programs. Jin-Soo Kim Computer Systems Laboratory Sungkyunkwan University Machine-level Representation of Programs Jin-Soo Kim (jinsookim@skku.edu) Computer Systems Laboratory Sungkyunkwan University http://csl.skku.edu Program? 짬뽕라면 준비시간 :10 분, 조리시간 :10 분 재료라면 1개, 스프 1봉지, 오징어

More information

Machine Language, Assemblers and Linkers"

Machine Language, Assemblers and Linkers Machine Language, Assemblers and Linkers 1 Goals for this Lecture Help you to learn about: IA-32 machine language The assembly and linking processes 2 1 Why Learn Machine Language Last stop on the language

More information

Assembly Programmer s View Lecture 4A Machine-Level Programming I: Introduction

Assembly Programmer s View Lecture 4A Machine-Level Programming I: Introduction Assembly Programmer s View Lecture 4A Machine-Level Programming I: Introduction E I P CPU isters Condition Codes Addresses Data Instructions Memory Object Code Program Data OS Data Topics Assembly Programmer

More information

Subprograms: Arguments

Subprograms: Arguments Subprograms: Arguments ICS312 Machine-Level and Systems Programming Henri Casanova (henric@hawaii.edu) Activation Records The stack is useful to store and rieve urn addresses, transparently managed via

More information

Complex Instruction Set Computer (CISC)

Complex Instruction Set Computer (CISC) Introduction ti to IA-32 IA-32 Processors Evolutionary design Starting in 1978 with 886 Added more features as time goes on Still support old features, although obsolete Totally dominate computer market

More information

Towards the Hardware"

Towards the Hardware CSC 2400: Computer Systems Towards the Hardware Chapter 2 Towards the Hardware High-level language (Java) High-level language (C) assembly language machine language (IA-32) 1 High-Level Language Make programming

More information

UW CSE 351, Winter 2013 Midterm Exam

UW CSE 351, Winter 2013 Midterm Exam Full Name: Student ID: UW CSE 351, Winter 2013 Midterm Exam February 15, 2013 Instructions: Make sure that your exam is not missing any of the 9 pages, then write your full name and UW student ID on the

More information

ASSEMBLY III: PROCEDURES. Jo, Heeseung

ASSEMBLY III: PROCEDURES. Jo, Heeseung ASSEMBLY III: PROCEDURES Jo, Heeseung IA-32 STACK (1) Characteristics Region of memory managed with stack discipline Grows toward lower addresses Register indicates lowest stack address - address of top

More information

Digital Forensics Lecture 3 - Reverse Engineering

Digital Forensics Lecture 3 - Reverse Engineering Digital Forensics Lecture 3 - Reverse Engineering Low-Level Software Akbar S. Namin Texas Tech University Spring 2017 Reverse Engineering High-Level Software Low-level aspects of software are often the

More information

Assembly III: Procedures. Jo, Heeseung

Assembly III: Procedures. Jo, Heeseung Assembly III: Procedures Jo, Heeseung IA-32 Stack (1) Characteristics Region of memory managed with stack discipline Grows toward lower addresses Register indicates lowest stack address - address of top

More information

Systems I. Machine-Level Programming V: Procedures

Systems I. Machine-Level Programming V: Procedures Systems I Machine-Level Programming V: Procedures Topics abstraction and implementation IA32 stack discipline Procedural Memory Usage void swap(int *xp, int *yp) int t0 = *xp; int t1 = *yp; *xp = t1; *yp

More information

1 /* file cpuid2.s */ 4.asciz "The processor Vendor ID is %s \n" 5.section.bss. 6.lcomm buffer, section.text. 8.globl _start.

1 /* file cpuid2.s */ 4.asciz The processor Vendor ID is %s \n 5.section.bss. 6.lcomm buffer, section.text. 8.globl _start. 1 /* file cpuid2.s */ 2.section.data 3 output: 4.asciz "The processor Vendor ID is %s \n" 5.section.bss 6.lcomm buffer, 12 7.section.text 8.globl _start 9 _start: 10 movl $0, %eax 11 cpuid 12 movl $buffer,

More information

CS 33: Week 3 Discussion. x86 Assembly (v1.0) Section 1G

CS 33: Week 3 Discussion. x86 Assembly (v1.0) Section 1G CS 33: Week 3 Discussion x86 Assembly (v1.0) Section 1G Announcements - HW2 due Sunday - MT1 this Thursday! - Lab2 out Info Name: Eric Kim (Section 1G, 2-4 PM, BH 5419) Office Hours (Boelter 2432) - Wed

More information

Intro to x86 Binaries. From ASM to exploit

Intro to x86 Binaries. From ASM to exploit Intro to x86 Binaries From ASM to exploit Intro to x86 Binaries I lied lets do a quick ctf team thing Organization Ideas? Do we need to a real structure right now? Mailing list is OTW How do we get more

More information

Machine Programming 1: Introduction

Machine Programming 1: Introduction Machine Programming 1: Introduction CS61, Lecture 3 Prof. Stephen Chong September 8, 2011 Announcements (1/2) Assignment 1 due Tuesday Please fill in survey by 5pm today! Assignment 2 will be released

More information

Machine and Assembly Language Principles

Machine and Assembly Language Principles Machine and Assembly Language Principles Assembly language instruction is synonymous with a machine instruction. Therefore, need to understand machine instructions and on what they operate - the architecture.

More information

Assembly Language: Function Calls" Goals of this Lecture"

Assembly Language: Function Calls Goals of this Lecture Assembly Language: Function Calls" 1 Goals of this Lecture" Help you learn:" Function call problems:" Calling and returning" Passing parameters" Storing local variables" Handling registers without interference"

More information

Inline Assembler. Willi-Hans Steeb and Yorick Hardy. International School for Scientific Computing

Inline Assembler. Willi-Hans Steeb and Yorick Hardy. International School for Scientific Computing Inline Assembler Willi-Hans Steeb and Yorick Hardy International School for Scientific Computing e-mail: steebwilli@gmail.com Abstract We provide a collection of inline assembler programs. 1 Using the

More information

Conditional Processing

Conditional Processing ١ Conditional Processing Computer Organization & Assembly Language Programming Dr Adnan Gutub aagutub at uqu.edu.sa Presentation Outline [Adapted from slides of Dr. Kip Irvine: Assembly Language for Intel-Based

More information

x86 assembly CS449 Spring 2016

x86 assembly CS449 Spring 2016 x86 assembly CS449 Spring 2016 CISC vs. RISC CISC [Complex instruction set Computing] - larger, more feature-rich instruction set (more operations, addressing modes, etc.). slower clock speeds. fewer general

More information

Introduction to Intel x86-64 Assembly, Architecture, Applications, & Alliteration. Xeno Kovah

Introduction to Intel x86-64 Assembly, Architecture, Applications, & Alliteration. Xeno Kovah Introduction to Intel x86-64 Assembly, Architecture, Applications, & Alliteration Xeno Kovah 2014-2015 xeno@legbacore.com All materials is licensed under a Creative Commons Share Alike license. http://creativecommons.org/licenses/by-sa/3.0/

More information

Stack Discipline Jan. 19, 2018

Stack Discipline Jan. 19, 2018 15-410 An Experience Like No Other Discipline Jan. 19, 2018 Dave Eckhardt Brian Railing Slides originally stolen from 15-213 1 15-410, S 18 Synchronization Registration The wait list will probably be done

More information

System Programming and Computer Architecture (Fall 2009)

System Programming and Computer Architecture (Fall 2009) System Programming and Computer Architecture (Fall 2009) Recitation 2 October 8 th, 2009 Zaheer Chothia Email: zchothia@student.ethz.ch Web: http://n.ethz.ch/~zchothia/ Topics for Today Classroom Exercise

More information

It is possible to define a number using a character or multiple numbers (see instruction DB) by using a string.

It is possible to define a number using a character or multiple numbers (see instruction DB) by using a string. 1 od 5 17. 12. 2017 23:53 (https://github.com/schweigi/assembler-simulator) Introduction This simulator provides a simplified assembler syntax (based on NASM (http://www.nasm.us)) and is simulating a x86

More information

3.1 DATA MOVEMENT INSTRUCTIONS 45

3.1 DATA MOVEMENT INSTRUCTIONS 45 3.1.1 General-Purpose Data Movement s 45 3.1.2 Stack Manipulation... 46 3.1.3 Type Conversion... 48 3.2.1 Addition and Subtraction... 51 3.1 DATA MOVEMENT INSTRUCTIONS 45 MOV (Move) transfers a byte, word,

More information

Machine-Level Programming II: Arithmetic & Control. Complete Memory Addressing Modes

Machine-Level Programming II: Arithmetic & Control. Complete Memory Addressing Modes Machine-Level Programming II: Arithmetic & Control CS-281: Introduction to Computer Systems Instructor: Thomas C. Bressoud 1 Complete Memory Addressing Modes Most General Form D(Rb,Ri,S)Mem[Reg[Rb]+S*Reg[Ri]+

More information

mith College Computer Science CSC231 Assembly Week #11 Fall 2017 Dominique Thiébaut

mith College Computer Science CSC231 Assembly Week #11 Fall 2017 Dominique Thiébaut mith College Computer Science CSC231 Assembly Week #11 Fall 2017 Dominique Thiébaut dthiebaut@smith.edu Back to Conditional Jumps Review sub eax, 10 jz there xxx xxx there:yyy yyy Review cmp eax, 10 jz

More information

Assembly Language: Function Calls

Assembly Language: Function Calls Assembly Language: Function Calls 1 Goals of this Lecture Help you learn: Function call problems: Calling and returning Passing parameters Storing local variables Handling registers without interference

More information

Assembly Language: Function Calls" Goals of this Lecture"

Assembly Language: Function Calls Goals of this Lecture Assembly Language: Function Calls" 1 Goals of this Lecture" Help you learn:" Function call problems:" Calling and urning" Passing parameters" Storing local variables" Handling registers without interference"

More information

Region of memory managed with stack discipline Grows toward lower addresses. Register %esp contains lowest stack address = address of top element

Region of memory managed with stack discipline Grows toward lower addresses. Register %esp contains lowest stack address = address of top element Machine Representa/on of Programs: Procedures Instructors: Sanjeev Se(a 1 IA32 Stack Region of memory managed with stack discipline Grows toward lower addresses Stack BoGom Increasing Addresses Register

More information