From d5d225e53f7843bc7f1db1d09c26ac39e9a0dd9d Mon Sep 17 00:00:00 2001 From: Valentin Brandl Date: Mon, 12 Nov 2018 14:40:59 +0100 Subject: [PATCH] Add ossec solution --- school/os-sec/uebung/02/02_1.md | 54 +++++++++++++++++++++++++++ school/os-sec/uebung/02/02_2.c | 63 ++++++++++++++++++++++++++++++++ school/os-sec/uebung/02/02_3.md | 39 ++++++++++++++++++++ school/os-sec/uebung/02/a.out | Bin 0 -> 15424 bytes 4 files changed, 156 insertions(+) create mode 100644 school/os-sec/uebung/02/02_1.md create mode 100644 school/os-sec/uebung/02/02_2.c create mode 100644 school/os-sec/uebung/02/02_3.md create mode 100755 school/os-sec/uebung/02/a.out diff --git a/school/os-sec/uebung/02/02_1.md b/school/os-sec/uebung/02/02_1.md new file mode 100644 index 0000000..e95ff0f --- /dev/null +++ b/school/os-sec/uebung/02/02_1.md @@ -0,0 +1,54 @@ +# Aufgabe 1 + +1) + * Fragment 1: fastcall, da die parameter durch die register eax, edx und ecx übergeben werden, return value in eax + * Fragment 2: cdecl, da die parameter in right-to-left order auf dem stack liegen, return value in eax, kein stack + cleanup + * Fragment 3: stdcall, parameter in right-to-left order auf dem stack, return value in eax, callee cleanup + +2) + * Fragment 1: EAX = a, edx = b, ecx = c + +Annahme: Angabe der Parameterreihenfolge _nach_ dem call, also im neuen stackframe + * Fragment 2: ebp+0x8 = a, ebp+0x0c = b, ebp+0x10 = c + * Fragment 3: ebp+0x8 = a, ebp+0x0c = b, ebp+0x10 = c + +Annahme: Angabe der Parameterreihenfolge _vor_ dem call, also im alten stackframe + * Fragment 2: esp = a, esp+0x4 = b, esp+0x8 = c + * Fragment 3: esp = a, esp+0x4 = b, esp+0x8 = c + + +3) + * Fragment 1: Caller cleanup bzw da nur 3 Parameter verwendet werden, kein stack cleanup nötig, da alle parameter + über register übergeben werden + * Fragment 2: Caller cleanup + * Fragment 3: Callee cleanup + +4) + Fragment 1: + + ``` + MOV eax, 3 + MOV edx, 2 + MOV ecx, 1 + CALL f + ``` + + Fragement 2: + + ``` + PUSH 1 + PUSH 2 + PUSH 3 + CALL f + ADD ESP, 12 + ``` + + Fragment 3: + + ``` + PUSH 1 + PUSH 2 + PUSH 3 + CALL f + ``` diff --git a/school/os-sec/uebung/02/02_2.c b/school/os-sec/uebung/02/02_2.c new file mode 100644 index 0000000..4d4d9c5 --- /dev/null +++ b/school/os-sec/uebung/02/02_2.c @@ -0,0 +1,63 @@ +#include + +/* +PUSH EBP +MOV EBP, ESP +SUB ESP , 4 ; reserve 4 bytes in the stack frame -> local variable int32_t -> i +MOV DWORD PTR [ EBP − 4 ] , 1 ; initialize local variable with 1 + +; EBP+8 : first parameter -> a +; EBP+12 : second parameter -> b + +loop: +CMP DWORD PTR [ EPB+ 8 ] , 99 ; while (a >= 99) +JL SHORT exit +LEA EAX, [ EBP+12 ] ; eax = *b; +DEC DWORD PTR [EAX] ; *b--; +CMP DWORD PTR [ EBP+ 12 ] , 99 ; if (b >= 99) +JL SHORT continue +JMP SHORT exit ; break + +continue: +MOV EDX, [ EBP+8] ; edx = a +LEA EAX, [ EBP − 4] ; eax = *i +ADD DWORD PTR [EAX] , EDX ; *eax += edx -> i += a +INC DWORD PTR [ EBP+8] ; a++; +JMP SHORT loop ; loop + +exit: +MOV EAX, DWORD PTR [ EBP − 4] ; return i +MOV ESP , EBP ; cleanup +POP EBP ; cleanup +RETN + + */ + +int32_t f(int32_t a, int32_t b) { + int32_t i = 1; + b--; + while (a >= 99 && b < 99) { + i += a; + a++; + b--; + } + return i; +} + +/* int32_t f(int32_t a, int32_t b) { */ +/* int32_t i = 1; */ +/* while (a >= 99) { */ +/* b--; */ +/* if (b < 99) { */ +/* i += a; */ +/* a++; */ +/* } else { */ +/* break; */ +/* } */ +/* } */ +/* return i; */ +/* } */ + +int main(void) { + f(1,2); +} diff --git a/school/os-sec/uebung/02/02_3.md b/school/os-sec/uebung/02/02_3.md new file mode 100644 index 0000000..45f28c1 --- /dev/null +++ b/school/os-sec/uebung/02/02_3.md @@ -0,0 +1,39 @@ +# Übung 2 Aufgabe 3 + +1. + +| Instruction | Kommentar | +| --- | --- | +| `push eax` | speichere wert aus eax auf dem stack | +| `push ecx` | 2. Parameter wird auf Stack gepusht | +| `push edx` | 1. Parameter wird auf Stack gepusht | +| `call CAFEBABEh` | Subrotine an Adresse 0xCAFEBABE wird aufgerufen | +| `add esp, 12` | Zuvor gepushte parameter werden aufgeräumt | + +| Instruction | Kommentar | +| --- | --- | +| `push ebp` | Wert von ebp wird auf Stack gespeichert | +| `mov ebp, esp` | ebp Zeigt auf aktuellen stack pointer | +| `sub esp, 4` | lokalen stackframe von 4 bytes reservieren | +| `mov ecx, [ebp+8]` | schreibe parameter 1 nach ecx | +| `add ecx, [ebp+12]` | addiere parameter 2 auf ecx (param1+param2) | +| `mov [ebp-4], ecx` | schreibe wert aus eax in lokalen stackframe; int x = (param1+param2) | +| `dec dword ptr[ebp-4]` | subtrahiere 1 von wert in lokalem stackframe; x-- | +| `dec dword ptr[ebp-4]` | subtrahiere 1 von wert in lokalem stackframe; x-- | +| `mov eax, [ebp-4]` | schreibe wert aus lokalem stackframe nach eax; return x | +| `mov esp, ebp` | stelle alten stackpointer wieder her | +| `pop ebp` | stelle alten basepointer wieder her | +| `ret 8` | springe zurück zum aufrufenden punkt und räume den stack auf | + +2. + +``` +int32_t f(int32_t a, int32_t b) { + return (a+b)-2; +} +``` + +3. + +4. +Sowohl Caller, also auch Callee räumen den Stack auf. Darüber hinaus diff --git a/school/os-sec/uebung/02/a.out b/school/os-sec/uebung/02/a.out new file mode 100755 index 0000000000000000000000000000000000000000..8375184d1c4dfd5e89b181da271cac96a458add6 GIT binary patch literal 15424 zcmeHOZ){W76~B&?;(;+C%}NGzys`*|tvr%|(lDf9L&Bdefj|On)s|N$b`lr=iR|Z* zAP`WmE6j})b*Sr?Z6DaGeb_W4_<&Stg}VIdG)1^0+2ipDO1?d zC61$jTwZ^|6k_5VitFKP0JGnWiBMt+{wes$w_ua$XAJVsfY;mxo2-3ZAK4L~A%y1p z{X5|Y`~hNo4r>?u<^A)cEi&Unh}H2}@9KDDRXmo=4x5>j*{po5OaGSbyKz)`=2%Fq zTMK6H>Axd3{51bmaKm?g_}HEJpI*6}D%3qqEc?J1GM9!hpvtmeeCxw=)XQmSnPEU* zTxKtao+z^o=qtb)i^*lNRgk*HwQYx$u_LjhmCZyW!m|2? z!&ZMR8IH#eL}3yMKsaq%iEu0_wsdUUxXEfZ8>h7ObXt*UIyw-`*wJ)P=cafn z8SM%8#u;NEkxG_gSPD8T5S^1Vgqif@$fvH8sMdg|cJve*}hZ>JN)Ip>3% z)N+HeYlBLT!+r=S;1(rL$OI*tnxe!>@dG!933AEJfSUm~18xS~47eF^GvH>x&48N$ zHv|9W40PwleZ~CL_0@|}j{ob=;3NcEHJ zfHr-)_xK078@IZ8b`|+fc(iZ|VMcSotB%t(n!ElU#Lhj==}BOVZ{aYJUs_-2AJd27|o4k3qgy2YvKK9@kyAAI-lwj{4}^!@G}vlpC+z$u3sETNt%hh_S-xnH9i^ z;!kim`u5jQAE@r~7`gGvm6y*?Rva&!zq!nF?Y&96Hvj4rLteG#A`M+TovR3#e{Kpf zRkZ%G+Y7$@IRh2D0X$mx9ey@IoFi|tQzF}t&)rges>zM}ozr{+cfQXe1S&Q{Ud$2c zQ9;pB#{1++IP$gi1v!rDViyoq!-#yTeTwhqH*0eVzbALd-+Qd}qH2+mtAeQaLd6T7;xA>ZzOyJ4?-ufvD$Bc{+|ynB!Cm%!k?gxaAFppH zR-t6{^dyhD2^?2mJb$;sUe@GbaJwD5{&C4C-lQ*g$%E0XyPN$m_m2OWz1DL&J4}25 zt;spG2FRm@)2oml&Kvf^B{u_Z2HXs|8E`Y;X28vWn*lciZU)>8xEc8W$$eb*RK#*!aS&^Gxu)6=IT!LZFxNTr9q@}_ z65p};!U~978_aiKG%pr`$Ka&i1<5tjK`__K^Z)kG9VbN<|E#7A`0)pCiv7iFWvT}D z-y!w;D~kUkI?F~uT>q}Ag`Ea*t@4&lo4#%|U?urVqt$FSn~dhhrq;&RHBA!n;DKxX zNox0iT05_7j#`Mz(|&Xu#Qc%GGNUSg%4SwoUX{)4A~&iU@ce}W=Wp6(rd0kYy#mXz zLCh=3E6)m)(%8K6?4bU%EziE(@1XFU1!^8BJ0NXgDBOxtoLf-K{~i`iRBtt_h) zpE)W+3PPJb7%Ppx0<)g;^h%lC0GrnbiGB`+?J=%L)QL_=UJoP>W~&X!Yl=kt5lB6L z561svI!ZKKf8Ky^@G%AOl=4@OKLbOz$E)N5Y&~y1$lq^a>-OmX0Jc6qJn<8-<%I>| zK|Vj`K&Hn#Pt1iK#Kp(r8uWiLl@b|{EwGOO&uguwV!k*ITb~aDS22J4(&wWZb}ejv zkC19A0-_uCA>@a@RWbf<*dwKUG2TAdnwCR(8Mcnkc>3BR#sHs$pVug9VZ|bG3U;NT z`p110Z^72YZoCisI@;s!T5SIufE+zrblj3K@q+@ z2wU5B32RHoj*X!XYscoz-R(VAPiSLDJEO{tEq$4+?D4QxICFc970INm!EiFdtuyy;&be?(@G9% zEtbT_pCMr;Q+Cu0ZQQoX4iA*9fn?U~&Bm~?Di#qYt-)|+P?(XCB;qM)rqDC< z#KOUp4X9v9pD;1?6PV8WTKab+pJ8yh;(K}Kemq^5KGIjfyt5Lg_q`d=HR;HhwXAr2F?NEFG^p2n=wuOTPL C45&f? literal 0 HcmV?d00001