Information Security - 2
Topic: Architectural Aid to Secure Systems Engineering V. Kamakot
RISE LAB, Department of Computer Science and Engineering IIT Madras
SESSION – 3: FUNCTION CALLS AND STACKS
Topic
• A sample of well-studied security issues
• Buffer Overflow
– What is this?
– Which system component causes it?
– What happens due to the same?
Function Calls
• Very important for Software Development
• Calling function and called function
• Call by Reference
– scanf(“%d”, &my_var)
• Call by Value
– printf(“%d”,my_var) – Function returns results
• Context of Calling function to be retained for continuation after called function returns.
• Use of Stack
– First-in Last-Out
– suits function execution model
main()
{ int am,bm,cm;
//am = 2, bm = cm = 1 bm = my_proc(am,bm);
//am=2, bm=21, cm=1 L1: ….. }
int my_proc(int em,int fm) { int am,bm,cm;
//em=2, fm=1, am=3, cm=6 bm = next_sk1(am,cm);
//em=2,fm=1,am=3,bm=18,cm=6 L2: cm = bm + am;
return(cm); //cm = 21; } int next_sk1(int gm, int hm) {int am; //gm=3,hm=6
am = gm* hm;
return(am); //am = 18;}
Initial State
Operating Systems Stack Smashing!!!
main()
{ int am,bm,cm;
//am = 2, bm = cm = 1 bm = my_proc(am,bm);
//am=2, bm=21, cm=1 L1: ….. }
int my_proc(int em,int fm) { int am,bm,cm;
//em=2, fm=1, am=3, cm=6 bm = next_sk1(am,cm);
//em=2,fm=1,am=3,bm=18,cm=6 L2: cm = bm + am;
return(cm); //cm = 21; } int next_sk1(int gm, int hm) {int am; //gm=3,hm=6
am = gm* hm;
return(am); //am = 18;}
1 2 L1
1 1 2
my_proc() is called by main()
am of main()
Ret. Addr
Arg1 for my_proc() Arg2 for my_proc()
bm of main() cm of main() FP
SP
main()
{ int am,bm,cm;
//am = 2, bm = cm = 1 bm = my_proc(am,bm);
//am=2, bm=21, cm=1 L1: ….. }
int my_proc(int em,int fm) { int am,bm,cm;
//em=2, fm=1, am=3, cm=6 bm = next_sk1(am,cm);
//em=2,fm=1,am=3,bm=18,cm=6 L2: cm = bm + am;
return(cm); //cm = 21; } int next_sk1(int gm, int hm) {int am; //gm=3,hm=6
am = gm* hm;
return(am); //am = 18;}
3 1 2 L1
1 1 2
6 3 L2
6 J
next_sk1() is called by my_proc() am of main()
Ret. Addr
em of my_proc() fm of my_proc()
bm of main() cm of main()
bm of my_proc() cm of my_proc() am of my_proc()
arg1 for next_sk1() arg2 for next_sk1()
Ret. Addr
main()
{ int am,bm,cm;
//am = 2, bm = cm = 1 bm = my_proc(am,bm);
//am=2, bm=21, cm=1 L1: ….. }
int my_proc(int em,int fm) { int am,bm,cm;
//em=2, fm=1, am=3, cm=6 bm = next_sk1(am,cm);
//em=2,fm=1,am=3,bm=18,cm=6 L2: cm = bm + am;
return(cm); //cm = 21; } int next_sk1(int gm, int hm) {int am; //gm=3,hm=6
am = gm* hm;
return(am); //am = 18;}
3 1 2 L1
1 1 2
6 18 L2 6 18
next_sk1() Finishes - Pop out
am of main()
Ret. Addr
em of my_proc() fm of my_proc()
bm of main() cm of main()
bm of my_proc() cm of my_proc() am of my_proc()
Ret val next_sk1()
Ret. Addr SP
FP
main()
{ int am,bm,cm;
//am = 2, bm = cm = 1 bm = my_proc(am,bm);
//am=2, bm=21, cm=1 L1: ….. }
int my_proc(int em,int fm) { int am,bm,cm;
//em=2, fm=1, am=3, cm=6 bm = next_sk1(am,cm);
//em=2,fm=1,am=3,bm=18,cm=6 L2: cm = bm + am;
return(cm); //cm = 21; } int next_sk1(int gm, int hm) {int am; //gm=3,hm=6
am = gm* hm;
return(am); //am = 18;}
3 1 21
L1 1 21
2
6 18 L2 6 18
my_proc() finishes
am of main()
Ret. Addr
Ret val my_proc() fm of my_proc()
bm of main() cm of main()
bm of my_proc() cm of my_proc() am of my_proc()
Ret val next_sk1()
Ret. Addr FP
SP