########################################
참고로 cd80님이 하시는건 AT&T문법이라
mov eax,ebx 는 ebx에 eax값을넣어라 지만
올리디버거에서 디버깅하는경우
mov eax,ebx 는 eax에 ebx값을넣어라입니다.
########################################
문제명이 BONUS 다. <그러므로 쉽다는 걸 알수있다.>
맨처음엔 1시간도안남기고 문제를봐서잔뜩쫄았지만..
올리디버거로 일단 프로그램을 실행시켜보았다.
OllyDBG의 기능으로 모든 문자열들을 추출해 보았다.
"YEAH you got it. You are realy a spaceball's :)))"
가 의심스럽다. 저문자열을 클릭해서 문자열의주소로 이동을 해보면..
정답구문과 미안하다는 틀렸다는 구문이보인다.
그리고
00401068주소에서 cmp eax,ebx
를검사하고
0040106D주소에서 jnz 00401185 로
간다고한다
근데 00401185로가면 정답구문을 지나쳤다 --..
jnz는 cmp구문에서 eax와 ebx가 틀리면~점프하겠다는말이다
그러니까 eax와 ebx가 같게해줘야하는게 우리의목표다
조금화면을 위로올린후 Name에 문제에서주어진 g0T3tr1s를넣고
Serial에 1234를 넣어보았다.
00401139 주소에서
edi에 g0T3tr1s 를넣는다.
0040113E mov ecx,eax //eax에는 Name 의 길이가 들어있다. 그러므로 ecx에는 Name의길이가 들어가게된다.
//ecx레지스터는 보통 이런 카운터연산에 쓰인다.
00401140~00401144 //xor 레지스터,같은레지스터를 연산한다. 이건 0으로초기화하겠다는것이다.
//xor 연산을 같은값하고하면 0이되기때문이다. 근데 이런생각을할수있다. mov 레지스터,0
//저도 이렇게생각을 했었으나 많이 보면 익숙해져서 당연해진다 ㄷㄷㄷㄷ
00401146 mov dh,byte ptr ds:[edi] // edi에는 아이디의 주소가 들어있다 근데 byte로 변환해서 dh에다 넣겠다한다.
// c언어에서 배열의 이름은 [0]번지의 주소를가르킨다. 그러니까 g0T3tr1s에서
// g를가져간다. g는 ASCII가103이니 16진수인 67이 dh에들어간다.
// 그러므로 edx는 6700이된다.
// 레지스터는 cd80님 블로그의 글을보면알수있다
00401148 imul edx,edx,BAADC0DE //edx와 BAADC0DE를 곱하기연산을해서 edx에다 넣는다.
0040114E add eax,edx // edx에넣은것을 eax에 더한다.
그다음 dec ecx //길이를 7로줄인다
inc edi// edi가 g0T3tr1s 인데 1증가하는 명령을했으므로 0T3tr1s가된다.
or ecx,ecx// ecx가 0이아닌이상..
jnz 00401144 //여기서 00401144로점프해버립니다
그렇게되면 계속 eax에 값이쌓일텐데
결과적으로 eax=884DB000 가된다.
00401156 mov ebx,eax //eax의값을 ebx에다 넣는다.
00401158 mov eax,dword ptr ds:[4030B2] // 시리얼의 길이가 eax에 들어가게된다.
// 1234를입력했으므로 4가들어갈것이다.
##############################
0040115D or eax,eax //eax가 0이면
je 0040119B //0040119B로 가겠다는것인데 0040119B로가게되면
"You have to type in your registration name and serial key!"
이런문자열이뜬다. 그러니까 아무것도입력하지않았을때 뜨게되는구문이니 두개는 상콤히 ㅎㄷ
##############################
00401161 push 0040309D // 시리얼로넣은 1234를 인자로
00401166 call 004011F0 // 004011F0을 콜한다.
//이콜문이 뭐하는놈이야;;이러면서 시간다되가는데하면서 그냥일단 지나쳐봤다.
유레카! //리턴값인eax에 4D2가 들어왔다. ㅋㅋㅋㅋㅋㅋㅋㅋ
// 4D2는 1234의 16진수란걸 외우고있었다 ㅋㅋㅋ;;; 덕분에 이제곧풀린다.
0040116B cmp eax,ebx //eax,ebx를비교한다. eax는 4D2 ebx는 884DB000 이다
0040116D jnz 00401185 //위두개가 틀리면 00401185로 점프하는데 거기는 Sorry를 출력한다 ㅜㅜ 그러니까
//우리가 시리얼에입력한수의 16진수가 884DB000이되야한다.
884DB000==2286792704
시리얼에 2286792704를넣고 인증을하면..
'Write-up' 카테고리의 다른 글
[HUST] 7. 수학 암호 (2) | 2012.12.03 |
---|---|
[순천향대 2012 정보보호 페스티벌 본선 사회공학적 해킹] (0) | 2012.09.17 |
[순천향대 2012 정보보호 페스티벌 본선 바이너리] (0) | 2012.09.15 |
[Write up]순천향대 정보보호 페스티벌 풀이 (2) | 2012.08.21 |
Codegate 2012 문제풀이 - Kaist GON (0) | 2012.07.09 |
댓글