26/08/07 1 shock shaastra obfuscated code contest sriram k r vivek s

25
26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

Upload: irvin-filby

Post on 30-Mar-2015

220 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

1

SHOCKSHaastra Obfuscated Code Contest

Sriram K RVivek S

Page 2: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

2

What is Obfuscation?What is Obfuscation?

• Obfuscation is about concealing the meaning of communication by making it more confusing and harder to interpret.

• One definition of "code obfuscation" is a set of transformations on a program, that preserve the same black box specification while making the internals difficult to reverse-engineer. There turns out to be many such transformations.

• The job of a good obfuscator is to destroy as much as possible of this structure that lends a program to being human-readable.

Page 3: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

3

Where it is used ?Where it is used ?

• It is used to deter reverse engineering attempts in languages like Java and the .NET family.

• Reverse obfuscation helps understand programs better.

• Obfuscated code is used by spammers to hide malicious JavaScript code in emails etc.

• Code size can be minimized by Obfuscation.

• Reducing variable name length

• Destroying structures and modules.

• It is done for recreational purposes.

Page 4: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

4

International ContestsInternational Contests

• There are contests held in the international level every year to test obfuscation skills of the contestants.

• IOCCC : International Obfuscated C Code Contest

• IORCC :International Obfuscated Ruby Code Contest

• Annual Obfuscated Perl Contest

Page 5: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

5

Some ExamplesSome Examples

#include<stdio.h>

int main (int j,char**V){char*R=V[1],i=0,k=48;for(;*R>k;*++R|| puts(R-i))++i;for(;++k<58;*R && main(*R=k,V),*R=1) for(j=81;j --;) *R*=R[j-i]-k||i/9^j/9&&i%9^j%9&&i/27^j/27|i%9/3^j%9/3;}

This 176 character C code solves SUDOKU !

Page 6: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

6

#define _ -F<00||--F-OO--;

int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO()

{

_-_-_-_

_-_-_-_-_-_-_-_-_

_-_-_-_-_-_-_-_-_-_-_-_

_-_-_-_-_-_-_-_-_-_-_-_-_-_

_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

_-_-_-_-_-_-_-_-_-_-_-_-_-_-_

_-_-_-_-_-_-_-_-_-_-_-_-_-_

_-_-_-_-_-_-_-_-_-_-_-_

_-_-_-_-_-_-_-_

_-_-_-_

}

Page 7: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

7

The Tardy Bus problemThe Tardy Bus problem

Given the following statements as premises:

1) If Bill takes the bus, then Bill misses his appointment, if the bus is late.

2) Bill shouldn't go home, if (a) Bill misses his appointment, and (b) Bill feels downcast.

3) If Bill doesn't get the job, then (a) Bill feels downcast, and (b) Bill should go home.

Is it valid to conclude:

Q1) that if Bill takes the bus, then Bill does get the job, if the bus is late? True

Q2) that Bill does get the job, if (a) Bill misses his appointment, and (b) Bill should go home? True

Page 8: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

8

Obfuscating Code

• Obfuscation and reversing it• Language specific techniques• C provides a lot of scope for obfuscation• Learning by studying obfuscated programs• Some examples

Page 9: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

9

Reversing Obfuscation – An Example

main( _,__,___,____,_____) {long long ago=741760571427457290;__=2925166600716333;___=++_<<--_+_<<_;____ = _;_____ =( ___*((___<<_)-(_<<_)))+(_<<_)+1;_=_=_=_=_=_=_=_=_=_=(_=_>>_-'>')+_____;while(_---'_')write(____,&__,____);_=_=_=_=_=_=_=_=_=_=(_=_>>_-'>') +_____;write(____,&ago,___);_=_=_=_=_=_=_=_=_=_=(_=_>>_-'>')+_____;while(_---'_')write(____,&__,____);printf("\n");}

Objective of the program is to print SHOCK surrounded by dashed lines.

Page 10: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

10

Step 1 : Indent the program

main( _,__,___,____,_____) {

long long ago=741760571427457290;

__=2925166600716333;

___=++_<<--_+_<<_;____ = _;

_____ =( ___*((___<<_)-(_<<_)))+(_<<_)+1;_=_=_=_=_=_=_=_=_=_=(_=_>>_-'>')+_____;

while(_---'_')

write(____,&__,____);_=_=_=_=_=_=_=_=_=_=(_=_>>_-'>')+_____;

write(____,&ago,___);_=_=_=_=_=_=_=_=_=_=(_=_>>_-'>')+_____;while(_---'_')write(____,&__,____);

printf("\n");

}

Page 11: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

11

Step 2 :Name variables properly

main( e,d,c,b,a) {

long long ago=741760571427457290;

d=2925166600716333;

c=++e<<--e+e<<e;b = e;

a =( c*((c<<e)-(e<<e)))+(e<<e)+1;e=e=e=e=e=e=e=e=e=e=(e=e>>e-'>')+a;

while(e---'_')

write(b,&d,b);e=e=e=e=e=e=e=e=e=e=(e=e>>e-'>')+a;

write(b,&ago,c);e=e=e=e=e=e=e=e=e=e=(e=e>>e-'>')+a;while(e---'_')write(b,&d,b);

printf("\n");

}

Page 12: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

12

Step 3 : Fix verbose statements

main( e,d,c,b,a) {

long long ago=741760571427457290;

d=2925166600716333;

c=++e<<--e+e<<e;b = e;

a =(c*((c<<e) - (e<<e)))+(e<<e)+1;

e=(e>>e-'>')+a;

while(e---'_')

write(b,&d,b);

e=(e>>e-'>')+a;

write(b,&ago,c);

e=(e>>e-'>')+a;

while(e---'_')

write(b,&d,b);

printf("\n");}

Page 13: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

13

Step 3 : Resolve the constants

main( e,d,c,b,a) {

char ago[9]="\n\tShock\n";

char f[2]="-";

c=++e<<--e+e<<e;b = e;

a =(c*((c<<e) - (e<<e)))+(e<<e)+1;

e=(e>>e-'>')+a;

while(e---'_')

write(b,&f,b);

e=(e>>e-'>')+a;

write(b,&ago,c);

e=(e>>e-'>')+a;

while(e---'_')

write(b,&f,b);

printf("\n");}

Resolve these constants by printing them

Page 14: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

14

Step 3 : Resolve the constants

main( e,d,c,b,a) {

char ago[9]="\n\tShock\n";

char f[2]="-";

c=++e<<--e+e<<e;b = e;

a =(c*((c<<e) - (e<<e)))+(e<<e)+1;

e=(e>>e-'>')+a;

while(e---'_')

write(b,&f,b);

e=(e>>e-'>')+a;

write(b,&ago,c);

e=(e>>e-'>')+a;

while(e---'_')

write(b,&f,b);

printf("\n");}

Resolve these constants by printing them

e = argc = 1

Page 15: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

15

The final program

main( e,d,c,b,a) {

char ago[9]="\n\tShock\n";

char f[2]="-";

c=8; b=1; a=115; e=115;

while(e---95)

write(1,&f,b);

e=209;

write(1,&ago,c);

e=115;

while(e---95)

write(1,&f,b);

printf("\n");}

Page 16: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

16

Another example

#define _ sum

#define __ prod(

#define l ~0

#define r return

#define ___ )

sum(i){while(!i)r

1;r __ i , ~i , i

^i);}prod(i,j,k){

j = _ (i-1);while

(i-- && (j= ~j))

k= (j>>l-(l<< 5))

?k+((j^~j)

-j):k+j;r k;}

main(){printf("%d"

,_(5));}

Page 17: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

17

Step 1 : Indentation

#define _ sum#define __ prod(#define l ~0#define r return#define ___ )

sum(i){ while(!i) r 1; r __ i , ~i , i^i);}prod(i,j,k){ j = _ (i-1); while (i-- && (j= ~j)) k= (j>>l-(l<< 5))?k+((j^~j)-j):k+j;r k;}main(){ printf("%d",_(5));}

Page 18: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

18

Step 2 : Resolve the defines

#define l ~0

sum(i){

while(!i) return 1;return prod ( i , ~i , i^i);

}prod(i,j,k){

j = sum (i-1);while (i-- && (j= ~j))k= (j>>l-(l<< 5))?k+((j^~j)-j):k+j;return k;

}main(){

printf("%d",sum(5));}

Page 19: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

19

Step 3 : Reduce complicated statements

sum(i){

while(!i) return 1;return prod (i ,~i ,0);

}prod(i,j,k){

j = sum (i-1);while (i-- )k= k+j;return k;

}main(){

printf("%d",sum(5));}

Page 20: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

20

The C Preprocessor

• Using defines to obfuscate code• Macros : Recursion and Precedence• The cpp instruction set is Turing Complete• Reversing with the help of cpp

Page 21: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

21

What you need to participate?

• Experience with programming in C

Additional skills that can help :

•Knowing other languages

•Some experience with logical puzzles etc

•Bad programming practices

What might not really help:

•Knowledge of obscure C constructs / functions

•Formal introduction to logic

Page 22: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

22

Event Format

• Prelims– Written– Questions on logic and code

obfuscation– Time : 30 – 45 mins

Page 23: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

23

Event Format

• Finals : – Two rounds

• Forward : You will be given a problem statement and some plain code and asked to obfuscate. Judges will award points to the obfuscated code based on certain criteria.

• Reverse : You will be asked to make sense out of obfuscated code.

Page 24: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

24

Event Format

• Finals - Forward Round :– Broadly, short and creative code will fetch more

points– Some of the possible criteria :

• Size / Number of Statements• Flow of control• Hiding constants• Syntax abuse• Legibility of code• Code shape etc

Page 25: 26/08/07 1 SHOCK SHaastra Obfuscated Code Contest Sriram K R Vivek S

26/08/07

25

Event Format

• Finals – Reverse round :– You might be asked to

• Predict the output• Swat bugs• Interface with the given code etc