엄범


문자열 check 루틴이 어딘지는 알겠는데,

어디 저장되는지 찾아야함.


204 200 4 이렇게 ebx+8이 가리키는 곳에 더하는데

이것들은 훼이크고 **(ebx+8)-4하면 문자열 있는 193A84나옴.

-4나오는 시점이 진짜임. 거서부터 문자열처리를 시작한다.


카운트 값이 저장되는 곳은  null check2 후에

ebx+64 -> **(ebx+8) -> **(ebx+8)+200  // ecx를 사용.

후에 eax랑 ebx+64에 이 카운트 값이 들어가고

나중에 ebx+64랑 ebx+68이랑 ADD해서, 처리해야 하는 문자 1개 얻음.



조건분기 2에서 *(ebx)과 *(ebx+64)를 비교한다. 둘 다 **은 문자열인데, *값은 다르다.

뭐 중요한건 아닌거같다. 훼이크인듯


조건분기 3이 중요. 여기서 문자열의 개수가 0x10=16이라는걸 알 수 있음.

거기서만 INC EAX타고 들어가야 다음으로 진행이 가능하다.



조건분기 4가 실질적인 문자열 비교 시작

*(ebx+8)에 input에서 문자 하나 취해서 저장하며 비교하는거 같음. 근데 이건 별로 중요한건 아니고.



세번째랑 아홉번째 값은 임시값으로 가도 상관 없는듯.

```c

KEY = S a [0] j T z f 4 [c] H 3 v v H 9 q

      Sa0jTzf4cH3vvH9q

```


71 = q

65 = e

다섯째 문자와 일곱번째 문자를 더함.

두 ascii를 더해서 BA가 나오는 두개가 다섯째 문자와 일곱번째 문자의 조합.

경우의수가 많아지니까 아마 답이 여러개일듯.

55 + 65같은거? U e

x + z = BA


여섯번째 문자도 다섯번째와 더한다. CE가 되도록. 

그럼 5 6 7번째가 서로의 값을 결정하겠다. 방정식하나 풀어야할듯.

x + y = CE

지금은 x가 U니까. 55 + 79(y) = CE

일단 U y e로 가야..

식이 하나 더필요하다.


여섯번째 문자와 일곱번째 문자를 더한 값은 y + z = E0

이제 방정식 풀 수 있다.


x+y = CE

x+z = BA

y+z = E0


2x+2y+2z = CE+BA+E0 = 268

x+y+z = 134

x = 54    T

y = 7A    z

z = 66    f



다섯번째, 여섯번째를 취해서 더한다. T+z = CE 근데 이거 아까도 했던건데.

일곱번째도 취해서 다더하는데... BYTE연산해서 1짤리고 34만나옴. 

무슨생각으로 이걸 넣어놨는지 모르겠지만 어차피 식3개 아까 나와서 그냥 구할 수 있음. 

따라서 여긴 무쓸모...처럼 보이지만 여덟번째 구하는데 필요한듯.

여덟번째는 별거 아니고 그냥 34(=4). 저거 다 더해서 나온거 1버린게 여덟번째 값.


열번째 값은 48(H)

열한번째 값은 33(3)

열두번째 값은 76


세번째 값 XOR 아홉번째 값 = 53

임시값.

01010011 = 53

00110000 = 30(0)

01100011 = 63(c)




■두번째 값은 61(a)이고.. 열여섯번째 값을 더한값은

열여섯번째 값은 일단 72(r) 더한건 D3

(열여섯번째 값 + 두번째 값)  AND   FF    =   열여섯번째 값 + 두번째 값 그대로 인디?

뭐 갑자기 1000000이 들어가고 이거랑 위에서 더한 값을 IMUL // D3... D3000000


□다섯번째 값 54(T)과 열네번째 값을 더한 값은

열네번째 값은 일단 77(w //더한건 CB

FF또나옴 아니자꾸 FF랑 AND를 왜하는건지

10000이 나옴 이번에는. 얘도 위에서 더한값이랑 IMUL // CB... 00CB0000


□랑 ■랑 더한다. D3CB0000


열한번째 값과 33(3) 열다섯번째 값을 더한 값은

열다섯번째 값은 일단 65(e) // 더한건 98


★★★★★★ FF랑 AND하는 이유가, 앞의 000000을 버리려고 그런거네.

000000FF랑 AND하면 뒤의 한BYTE 말고 다 0되니까. IMUL 선행작업이다.


얘는 100이랑 곱한다. 한꺼번에 DWORD로 만들어서 처리하려고 하는 거.

그래서 지금까지 D3CB9800이다.

마지막 BYTE는 아무래도 열세번째 값이 들어가겠지.


역시. 열세번쨰 값이 들어간다.

열세번째 값은 일단 71(q) 얘는 그대로 D3CB9800에 더해서

D3CB9871이 됨.


32303038   XOR  구한 DWORD  ==   E0AC5C4E 가 나와야 함



◈◈◈◈◈즉 D29C6C76가 구한 DWORD가 되어야 한다

□다섯번째 값 54(T)과 열네번째 값을 더한 값은

열세번째 값 76(v)

열네번쨰 값은 48(H)

열다섯번째 값은 39(9)

열여섯번째 값은 71(q)


=====================================================



문자열 처리가 끝나기 전

ebx+8이 가리키는 곳 -4에는 문자열

ebx+8이 가리키는 곳에 200을 더한 곳에는 카운터



문자열 처리가 끝난 후

ebx+4는 문자열 포인터



'Security > CTF' 카테고리의 다른 글

[0ctf] BABYHEAP - fastbin attack, chunk overlap  (0) 2017.07.02
[SecuInside 2017] BABYHEAP : realloc(ptr, 0) / UAF  (0) 2017.07.02
[Trend Micro CTF 2017] Forensic  (0) 2017.06.27
[Trend Micro CTF 2017] Analysis-offensive  (0) 2017.06.23
FSC level3  (0) 2016.11.28
15'' whitehat contest, (= 16'' UXG)  (0) 2016.09.04