목록Write-up/Reversing (13)
또 뭐하지
풀이제공된 파일을 IDA로 실행시켰다.correct가 출력되게 하는 부분을 찾아서 decompling 해줬다코드를 살펴보면 32바이트 문자열을 s2에 받아서 8번의 함수연산을 통해 암호화한 다음, s2의 값과 비교하여 일치하면 correct가 나오는 것을 알 수 있다. unk_402008 = [ 0xF8, 0xE0, 0xE6, 0x9E, 0x7F, 0x32, 0x68, 0x31, 0x05, 0xDC, 0xA1, 0xAA, 0xAA, 0x09, 0xB3, 0xD8, 0x41, 0xF0, 0x36, 0x8C, 0xCE, 0xC7, 0xAC, 0x66, 0x91, 0x4C, 0x32, 0xFF, 0x05, 0xE0, 0xD9, 0x91]먼저 복호화해야하는 값인 s2 값 (=unk_..
풀이제공된 html 파일에 들어가서 내 생일을 입력해보았다. 아쉽게도 정답이 아니다.6자리 정도면 brute force도 나쁘지 않을 것 같지만 일단 소스코드를 살펴보자. confrim 버튼을 누르면 어떤 일이 발생하는지 요소 버튼을 통해 확인해보니, 입력한 값이 _0x9a220 함수로 넘어가는 것을 확인할 수 있었다.sources 탭을 통해 _0x9a220 함수를 찾아봤는데 하나도 알아볼 수 없었다.그냥 brute force를 하기로 하자.일단 방해가 되는 return alert('Wrong') 부분을 return 0가 되도록 원본 파일을 수정해주었다.for (var y = 0; y 그리고 코드를 작성하여 console 창에 입력했다. 한참 기다린 뒤에야 값이 나왔다. 그리고 화면에 떠있는 flag를 ..
풀이main 함수이다. sub_140001000 함수를 살펴봐야할 것 같다.함수를 살펴보면 일단 문자열 a1의 길이는 8의 배수여야 한다. 그리고 이 문자열을 8바이트 단위로 sub_1400010A0 함수에 넘겨준다. 이제 sub_1400010A0 함수를 확인해보자.byte_140004020[(unsigned __int8)v5[j] ^ v2]는 v5[j]와 v2를 XOR 연산하고, 그 결과를 인덱스로 사용하여 byte_140004020에서 값을 가져온다. 그 가져온 값을 b라고 할 때 a1[(j+1)%8]과 더한 다음 그 값을 5만큼 right rotate 해준다. 그 값을 다시 a1[(j+1)%8]에 넣어준다ubk_140004000와 byte_140004020 값을 얻어오자. #ubk_140004000..
풀이main 함수이다. sub_140001000 함수를 살펴봐야할 것 같다.a1에 -5를 곱한 값이 byte_140003000의 값과 일치하면 된다. 그런데 여기서 unsigned 값을 사용하기 때문에 쉽게 구할 수 는 없을 것 같다. byte_140003000 값을 얻어오자.a = "AC F3 0C 25 A3 10 B7 25 16 C6 B7 BC 07 25 02 D5 C6 11 07 C5 00 00 00 00 00 00 00 00 00 00 00 00"a = a.split()[:21]a = [int(x, 16) for x in a]tmp = []for t in a: for x in range(256): if (x * 251) % 256 == t: tmp..
풀이main 함수이다. sub_140001000 함수를 살펴봐야할 것 같다.__ROL1__(*(_BYTE *)(a1 + i), i & 7)는 읽은 바이트를 왼쪽으로 (i & 7) 비트만큼 회전하는 코드이다. 여기서 & 7 연산은 i 값을 8로 나눈 나머지를 구하는 것과 같으므로, 회전 수는 항상 0에서 7 사이가 된다. __ROL1__은 "Rotate Left" 연산을 의미한다. 해당 연산을 한 후 i와 xor한 값이 byte_140003000 값과 일치하면 조건에 맞는 값이다. byte_140003000을 얻어오자. a = "52 DF B3 60 F1 8B 1C B5 57 D1 9F 38 4B 29 D9 26 7F C9 A3 E9 53 18 4F B8 6A CB 87 58 5B 39 1E"a = a.s..
풀이main 함수이다. 필요한 sub_140001000 함수를 살펴보자.sub_140001000를 살펴보면 byte_140003020 배열의 a1[i]번째의 값이 byte_140003000[i] 값과 동일하면 correct가 출력된다는 것을 알 수 있다. byte_140003020 값과 byte_140003000 값을 가져온다a = "63 7C 77 7B F2 6B 6F C5 30 01 67 2B FE D7 AB 76 CA 82 C9 7D FA 59 47 F0 AD D4 A2 AF 9C A4 72 C0 B7 FD 93 26 36 3F F7 CC 34 A5 E5 F1 71 D8 31 15 04 C7 23 C3 18 96 05 9A 07 12 80 E2 EB 27 B2 75 09 83 2C 1A 1B 6..
풀이main 함수를 보자. 이번에는 sub_140001000 함수를 봐야한다. 함수를 살펴보면 a[i]+a[i+1] 이 byte_140003000의 배열값과 일치하면 된다. 여기서 생각해보면 (byte_140003000의 배열값이 data라고 할 때)data[0] = a[0] + a[1]data[1] = a[1] + a[2]...data[23] = a[23] + a[24]이다. data[23] = 0 인데 a는 unsigned integer이니까 a[23] = a[24] = 0 이어야 data[23] = 0일 수 있는 것을 알 수 있다. byte_140003000에서의 값을 찾아오자. hex_string = "AD D8 CB CB 9D 97 CB C4 92 A1 D2 D7 D2 D6 A8 A5 DC C7..
풀이main 함수이다. sub_140001000 함수을 살펴보자.함수를 살펴보면 byte_140003000에 위치한 배열과 a1의 상위 4비트, 하위 4비트의 위치를 바꾼 값과 비교해서 일치하면 되는 것을 확인할 수 있다. byte_140003000의 배열값을 복사하고, 파이썬 코드를 작성하자. 배열값의 상위 4비트, 하위4비트의 위치를 바꾸면 원하는 값을 얻을 수 있을 것이다. data = bytes.fromhex("24 27 13 C6 C6 13 16 E6 47 F5 26 96 47 F5 46 27 13 26 26 C6 56 F5 C3 C3 F5 E3 E3 00 00 00 00 00")tmp = []for i in range(28): a = (data[i]>4)%256 tmp.append(..