BAAASIC GNIREENIGNE
출처: HISCHALL 2013
40점
설명: 히히히
basic50!!.exe

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

입력받는 부분의 어셈부터 보도록 하겠다.

.text:00BC1564                 call    INPUUUUUUUUUT

이부분이 입력값을 받는 함수를 호출하는 부분이다.

이 뒤에 루틴부터 설명하도록 하겠다.


.text:00BC156C                 mov     eax, 1
.text:00BC1571                 imul    eax, 5
.text:00BC1574                 movsx   ecx, [ebp+eax+buffer[0]]
.text:00BC1579                 cmp     ecx, 69
.text:00BC157C                 jnz     loc_BC16D2

buffer[0]에서 5만큼 떨어진 거리 (buffer[5])하고 69('E')를 비교하고있다.

loc_BC16D2 이 부분은 살펴보니 wrong이라는 문자열을 포함하고 있었다.

틀리면 호출되는 부분일 것이다. 따라서 저부분을 회피하면서 문자열을 작성 해주면 된다.

현재 BUFFER = ?????E???????????


.text:00BC1582                 mov     eax, 1
.text:00BC1587                 shl     eax, 0
.text:00BC158A                 movsx   ecx, byte ptr [ebp+eax-1Ch]
.text:00BC158F                 xor     ecx, 9
.text:00BC1592                 cmp     ecx, 'p'
.text:00BC1595                 jnz     loc_BC16D0


(헥스레이로 훑어본 결과 shl부분은 별 의미가 없는듯 싶다.)

이번에는 buffer[1]에 x^9 = p 라는 식이 보인다.

112 ^ 9 = y 이므로 input[1] = y

현재 BUFFER = ?y???E??????


.text:00BC159B                 mov     eax, 1
.text:00BC15A0                 imul    eax, 15
.text:00BC15A3                 movsx   ecx, byte ptr [ebp+eax-1Ch]
.text:00BC15A8                 sub     ecx, 10
.text:00BC15AB                 cmp     ecx, 87

어셈으로 봤을 때, 15보다 큰 숫자가 없으므로 문자열의 길이는 총 16글자일 것이다.

buffer[15]를 87 + 10(a)와 비교하고 있다

현재 BUFFER = ?y???E?????????a




.text:00BC15B4                 mov     eax, 1
.text:00BC15B9                 imul    eax, 6
.text:00BC15BC                 mov     cl, [ebp+eax+buffer[0]]
.text:00BC15C0                 mov     byte ptr [ebp+Str1], cl
.text:00BC15C3                 mov     eax, 1
.text:00BC15C8                 imul    eax, 7
.text:00BC15CB                 mov     cl, [ebp+eax+buffer[0]]
.text:00BC15CF                 mov     byte ptr [ebp+Str1+1], cl
.text:00BC15D2                 mov     eax, 1
.text:00BC15D7                 shl     eax, 3
.text:00BC15DA                 mov     cl, [ebp+eax+buffer[0]]
.text:00BC15DE                 mov     [ebp+var_36], cl
.text:00BC15E1                 mov     eax, 1
.text:00BC15E6                 imul    eax, 9
.text:00BC15E9                 mov     cl, [ebp+eax+buffer[0]]
.text:00BC15ED                 mov     byte ptr [ebp+var_35], cl
.text:00BC15F0                 mov     eax, 1
.text:00BC15F5                 imul    eax, 0Ah
.text:00BC15F8                 mov     cl, [ebp+eax+buffer[0]]
.text:00BC15FC                 mov     byte ptr [ebp+var_35+1], cl
.text:00BC15FF                 mov     eax, 1
.text:00BC1604                 imul    eax, 0Bh
.text:00BC1607                 mov     cl, [ebp+eax+buffer[0]]
.text:00BC160B                 mov     byte ptr [ebp+var_35+2], cl
.text:00BC160E                 mov     eax, 1
.text:00BC1613                 imul    eax, 0Ch
.text:00BC1616                 mov     cl, [ebp+eax+buffer[0]]
.text:00BC161A                 mov     byte ptr [ebp+var_35+3], cl
.text:00BC161D                 mov     eax, 1
.text:00BC1622                 imul    eax, 0Dh
.text:00BC1625                 mov     cl, [ebp+eax+buffer[0]]
.text:00BC1629                 mov     byte ptr [ebp+var_31], cl
.text:00BC162C                 mov     eax, 1
.text:00BC1631                 imul    eax, 0Eh
.text:00BC1634                 mov     cl, [ebp+eax+buffer[0]]
.text:00BC1638                 mov     byte ptr [ebp+var_31+1], cl
.text:00BC163B                 mov     [ebp+var_2F], 0
.text:00BC163F                 xor     eax, eax
.text:00BC1641                 mov     [ebp+var_2E], eax
.text:00BC1644                 mov     [ebp+var_2A], eax
.text:00BC1647                 mov     [ebp+var_26], ax
.text:00BC164B                 push    offset Str2     ; "paktdlTdm"


buffer[6] ~ buffer[15] 를 paktdlTdm이라는 문자열과 비교해주고있습니다.

현재 BUFFER = ?y???EpaktdlTdma


mov     eax, 1
.text:00BC1665                 imul    eax, 0
.text:00BC1668                 movsx   ecx, [ebp+eax+buffer[0]]
.text:00BC166D                 cmp     ecx, 'd'

buffer[0]을 d랑 비교해주고 있습니다.

현재 BUFFER = dy???EpaktdlTdma


mov     eax, 1
.text:00BC1677                 shl     eax, 1
.text:00BC1679                 mov     cl, [ebp+eax+buffer[0]]
.text:00BC167D                 mov     byte ptr [ebp+var_48], cl
.text:00BC1680                 mov     eax, 1
.text:00BC1685                 imul    eax, 3
.text:00BC1688                 mov     cl, [ebp+eax+buffer[0]]
.text:00BC168C                 mov     byte ptr [ebp+var_48+1], cl
.text:00BC168F                 mov     eax, 1
.text:00BC1694                 shl     eax, 2
.text:00BC1697                 mov     cl, [ebp+eax+buffer[0]]
.text:00BC169B                 mov     [ebp+var_46], cl
.text:00BC169E                 xor     eax, eax
.text:00BC16A0                 mov     [ebp+var_45], ax
.text:00BC16A4                 push    offset aAka     ; "aka"
.text:00BC16A9                 lea     eax, [ebp+var_48]
.text:00BC16AC                 push    eax             ; Str1


buffer[1] ~ buffer[3] 까지 aka라는 문자열과 비교해주고있구요.

현재 BUFFER = dyakaEpaktdlTdma



평소에는 난독증이 있어서 어셈을 잘 보지못했었는데 헥스레이랑 같이 보니까 재밌기도하고 답이나오네요 ㅎ

너무 헥스레이를 믿어서는 않될것같습니다.

'CTF' 카테고리의 다른 글

2014 codegate junior shellme  (0) 2015.04.05
2015 bostonkeyparty havard  (0) 2015.03.10
2015 nullcon 400  (0) 2015.01.28
2015 Nullcon exploitation 300  (0) 2015.01.19
Codegate 2014 후기  (2) 2014.02.24
Posted by windowhan
,