2010.04.30 10:40 WarGame




이제 슬슬 익숙해지네요

사진 한장에 설명은 없습니다

전화기 5번에 링크가 되어 있군요

들어가보면...




XML 코드가 나옵니다

구글링해보면 대략 XML-RPC 의 실패 응답 코드와 일치하는군요

먼저 XML-RPC 의 개념입니다

http://ko.wikipedia.org/wiki/XML-RPC

인코딩 형식은 XML 을, 전송 방식에서는 HTTP 프로토콜을 사용하고 있는 RPC 프로토콜의 일종입니다

그러니까 HTTP를 통한 간단하고 이식성 높은 원격 프로시져 호출 방법 [ RPC ] 이라는 것이죠

이식성이 높다 함은

서로 다른 운영체제를 2대 이상의 컴퓨터에서 
서로 다른 언어로 작성된 프로그램이 프로세스를 공유하면서
수행되도록 구성하기 위한혹은 브라우저가 아닌 프로그램이 
웹에서 가능하도록 정보를 배포하기 위한, 

이라고 보시면 되겠죠?

XML-RPC는 Perl, Java, Python, C, PHP 등 다른 많은 언어로 사용할 수 있다고 하는군요

XML-RPC에 대한 좀 더 자세히 알아보고 싶으시면

를 참조하시면 도움이 될껍니다

어떤 XML-RPC 책의 소개 부분인것 같네요

어떤 책인지 정확히 명시 못하는 점 죄송합니다

XML-RPC의 유용성에 대해서는 아직 모르겠습니다

XML-RPC를 제공하는 블로그들은 이를 통해 글을 등록할 수 있다는데

흠.. 다음, 네이버 등도 이를 제공한다고 하더군요

아무튼 각설하고, 문제로 넘어가봅시다

Phone the evil
 을 주시해야 할 것 같네요
혹시 전 문제를 열심히 푸셨던 분이라면 힌트를 얻을 수 있습니다

 evil4.jpg 의 내용이 Bert is evil! 이었죠
Phone the evil 이 무슨 뜻인고 해서 python의 xml 모듈을 뒤져보았습니다
먼저  XML-RPC Server에서 제공하는 API를 알아내야 합니다


 

system 의 listMethods()를 이용해서 확인하면 되겠군요


결과는 다음과 같습니다



 
 

phone, system.listMethods, .....

이를 이용해볼까요?

그 전에 phone method 에 대한 정보가 있어야 겠죠



두 가지를 써서 phone에 대한 정보를 알아냅니다

methodSignature 의 리턴값은 첫번째는 method 의 return type 이고, 나머지는 parameter라고 합니다

methodHelp 는 특정 method 에 대한 설명이구요

            한번 써볼까요?





특정 이름에 대한 번호를 리턴하며

return type , parameter 모두 string 형입니다

그럼 바로 phone 에 parameter로 Bert를 줘서 호출해봅시다



그럼 답이 쨘-

어때요, 참 쉽죠?

...

소스가 왜 저렇게 나오는지 모르겠네요 -.-

맨 위에 하나는 정상인데 밑에 2개는 프리즌 브레이크를 찍고 있네요

티스토리 이거 작성하다 보니 버그가 좀 보이는군요

작성 중간에 꺼지면 임시저장은 되는데

기껏 작성해놓은 코드가 엉망이 되버리구요

저런거 안고쳐주나 ..

Posted by LinkC

2010.04.26 00:53 WarGame



이번 문제도 달랑 사진 1장 있네요

제목은 dealing evil

사진명은 evil1.jgp 입니다

혹시해서 evil2.jpg를 쳐보니

빙고로군요



evil2.jpg 를 evil2.gfx 를 쳐보니 파일 하나를 받을 수 있네요

gfx 파일이 뭔지 계속 들여다봤는데 일반적 gfx는 아닌거 같습니다





gfx의 Hex Editor 로 본 값입니다만.. 헤더가 뒤죽박죽이네요

자세히 보시면 ...

여러 개의 헤더가 섞여 있는 것을 보실 수 있습니다

J F I F...

5개 파일이 들어있는거 같네요

맨 카드를 5개로 나누는 사진이 있었던 걸 떠올리면

얼추 맞아들어가는 이야기 같네요

좀 더 자세히 보면

5바이트를 주기로 파일 내용이 있는 것을 확인 하실 수 있습니다

그러니까

[1] [2] [3] [4] [5] [1] [2] [3]...

이런식으로 간다는 거죠

파일 5개를 만들어 각각 한바이트씩 넣어주면 되겠네요




2번째 반복문에서는 enumerate 를 써보았는데요

원형은 다음과 같습니다


특정 리스트를 순서 매기고 싶을 때 사용하면 좋겠죠?

확장자는 완성된 파일의 헤더를 보고 지정을 해주셔도 되지만

그림판으로 여시면 알아서 출력됩니다 :D

Posted by LinkC

2010.04.07 19:24 WarGame




주석도 없고 사진 설명도 없습니다

제목은 odd even

뭔가 감이 오는데요

사진의 Pixel 을 홀, 짝으로 나누어보면

답이 나올 것 같은 느낌이 마구마구 드는군요

가로 , 세로가 모두 홀, 짝 2개씩으로 나눠지니까

총 4개의 그림이 생기겠군요


답을 확인할 수 있습니다

좀 신기하네요 :D

아무튼 다른 그림도 확인해봤는데

x,y가 홀이나 , 짝으로 같을 경우엔 정답 화면이

x,y가 서로 다른경우엔 다음과 같은 사진이 뜨는군요




2로 나눠준것 떄문에 그런가 싶어서 다시 해봤는데도 결과는 동일합니다

얻어오는 픽셀 정보가 다른데도 픽셀 수가 많다보니 같게 보이는 거겠죠

아무튼 전 문제보단 훨씬 간결하군요

어때요 참 쉽죠?

Posted by LinkC

2010.04.07 10:53 WarGame




10번이군요

a[30]의 길이를 구하라고 합니다

소 모양의 링크를 따라 들어가면

a = [ 1, 11,  21 , 1211, 1112221 ,

책을 많이 읽은 분은 혹시 알아챘을지도 모르겠는데

베르나르 베르베르의 소설 , 개미에 나오는 '개미수열'입니다

2개씩 끊어서 보시면 돼는데

11은 1개의 1

21은 2개의 1

1211은 1개의 2 , 1개의 1

...

이런식으로 쭉 가게 되구요

좀 더 이 수열을 살펴보게 되면

4는 나오지 않는다는 것을 확인할 수 있습니다

예를 들어, 4가 나오려면 1 1 1 1 과 같이 같은 수가 4개 연속으로 나와야 하는데

사실 2,2개씩 나눠서 읽는 개미수열에서는 4 는 나올 수 없게 되는거죠

아무튼 개미수열이라는 것을 알았고

다음 수열을 구하기 위해서는

앞에서부터 중복되지 않은 숫자의 개수와, 그 수를 체크해야합니다




짜고 보니 매우 C언어스럽습니다

코드도 지저분 하구요

for 문 바깥에 있는 부분

result.append(str(cnt))
 result.append(i)
 


은 마지막 숫자를 염두해두었는데

예를 들어 11 이라고 하면

21 로 표현되어야 하는데 리스트의 마지막까지 가버렸기 때문에 for문 조건을 만족해서

튀어나와 버리고 append가 되지 않았기 때문에 붙여줬습니다만, 보기 싫으니

이것도 일반항으로 묶어버립시다

리스트에 1,2 이외의 문자를 하나 넣으면 되겠죠

또한 if, else 문을 하나로 줄이고

이를 위해서는 리스트에 직접 접근하는게 좋겠군요

cnt 를 좀 더 세분화 시켜야 합니다

start, end 로 나눠보면 쉽겠죠



Python의 스멜은 아직도 나지 않는군요 -.-

풀고 나서 다른 풀이를 보니

향긋한 Python 스멜을 풍기는 것을 발견했습니다

바로 itertools 모듈에 있는 groupby 함수를 쓰는 건데요

groupby 함수는 연속된 수를 묶어주는 역할을 합니다

다음은 groupby의 사용예 입니다





data 이외에 keyfunc를 줘서 group화하는 조건을 변경 할 수도 있습니다

이 예로는 다음과 같습니다


 
출처 :  파이썬 마을 , http://bbs.python.or.kr/viewtopic.php?t=23751

위 소스의 결과는

a1 ['c', 'd', 'g']
c2 ['d', 'g', 'f', 'a', 'h']

이구요

본론으로 넘어가서 우리가 구하고자 하는 개미 수열은 keyfunc 이 필요없는 관계로

인자를 하나만 넣어줘도 됩니다

예를 들어

1,1,2,1 을 groupby 함수의 인자로 주면

첫번째 리턴값으로 그 수를, 두번째로 그 수로 그룹화된 모임의 주소를 리턴해주게 됩니다

group화된 숫자 ,  group화된 모음의 주소 

이 주소를 list 나 tuple 로 변환하면

1 [ 1,1 ]
2 [ 2]
1 [1]

가 되겠죠

이를 적용하여 , 파이썬의 자료형  Dictionary 와 결합합니다

Dictionary 의 경우, 말 그대로 사전이라고 이해하시면 됩니다

dict = { "LinkC" :  "포풍놈팽이" }

라고 했을때, dict [ LinkC ] 를 하면 "포풍놈팽이"를 리턴하게 되는거죠

아무튼 위 기법을 적용해서 소스를 짜게 되면 ..



기발한 다른 경우도 굉장히 많군요


One line Solution 도 있네요


 



Posted by LinkC

2010.03.31 20:26 WarGame

level 9 문제입니다



페이지의 Title 은 Connect the dots입니다

점들을 연결하면 특정 문자나 그림 같은게 나오는 형식이겠죠

소스를 보면 힌트가 있습니다




first , second 를 주는데 표기 방식은 저번 문제의 벌 링크와 비슷해서 눈치채기 쉬웠습니다

first 와 second 개수가 다르므로 x,y 좌표가 떨어져있는거 같진 않고

아마 first 와 second를 혼합하면 답을 알 수 있을 형식일겁니다

먼저 fisrt와 second 모두  구조는  [ 1st Dot.x , 1st Dot y , 2nd Dot x, 2nd Dot y, ...... ]

이렇게 이루어 지겠죠

이제 각 점을 이용해 그리는 함수만 찾으면 됩니다

저번에 받은 PIL 를 뒤적거려보면

Draw Line 기능을 가진 함수가 있습니다

좌표를 리스트로 받으니 1번째부터 4번째까지 넘겨주면 되겠군요

이를 반복문으로 돌리고

총 정리를 해보면

1. 빈 이미지 파일 생성 [ RGB  모드 , 500 * 500 이면 적당 ]

2. First , Second 리스트를 이용해 Draw Line 호출

3. 그린 파일 저장

이를 소스로 나타내면




다른 풀이를 봤는데

map 과 lamda 를 이용해서 풀었더군요

map 은 첫번째 함수를  두번째 인자에 일괄 적용하는 함수이고

lambda는 일시적인 함수 생성 이라고 보시면 되는데

이를 이용해서 first 와 second를 각각 2개의 쌍을 짓는 리스트로 만들어냅니다

그리고 이 작은 리스트는 각각 x와 y를 나타내고 이를 그리면 되는거죠





다음은 첫번째와 두번째 점을 찍었을때 나타나는 그림입니다

문제 만드신분 참 수고하셨다는 생각이 ..


Posted by LinkC

2010.03.30 19:20 WarGame




8번입니다

소스보기를 하면


입니다

coords 해서 복잡하게 찍혀있는건

링크를 벌 모양 따라 그리기 위한 것이구요

각 점은 좌표를 나타냅니다

일단 링크를 따라 가보면

로그인 창이 나타납니다

ID, PW 를 입력해야 하는데

아무튼.. 문제는

바로 아래 주석인데요

주석이 ID, PW 겠죠

BZh91AY&SY 를 구글링 해보니

마침 bz2 모듈이 눈에 띕니다

BZh91AY&SY 는 bz2 파일의 헤더를 나타내는 것이라는군요

bz2 파일을 받아서 직접 확인해봤습니다



음 맞네요

주석값을 bz2 모듈을 이용해서 풀어보면 답이 간단하게 나옵니다





어때요 참 쉽죠?
Posted by LinkC

2010.03.30 10:14 WarGame


it's in the air. look at the letters.


이 말만 있습니다 -.-

소스보기해도 아무것도 안보이고

쿠키를 보니 wikiticket 이던가 이상한 쿠키가 잡혔는데

Firebug로 보니 또 안잡히더군요

아무튼 그걸로 삽질좀 하다보니 이게 아니더라 싶었습니다 -.-

공기에 있는것.

질소? 산소?

nitrogen, oxygen

산소가 정답이군요

이제서야 문제가 나옵니다만...



....

갈수록 문제가 꼬아져나오는군요

좀전의 문제 힌트  look at the letters...

아무래도 여기에 정답이 숨어져있는 것 같습니다

HexEditor 로 열어서 pass, hint, next 찾아봤습니다만 아무것도 건질 수 없었습니다

흠..

그 회색바에 글자가 있는거 같긴 한데

이미지뷰어로 보다 보니 RGB 값이 하단에 나옵니다

보니까 낯익은 범위의 숫자만 보이는군요

아무래도 ASCII 값인거 같습니다

초반 몇개만 집어서 확인해볼까요?

115.. 109.. 97... 114.. 116

smart

아무래도 제대로 짚은거 같군요

남은걸 일일히 손으로 하는 방법도 있겠습니다만

Python을 이용해 푸는게 깔끔하겠죠

먼저 , image에 관련된 모듈을 찾기 위해서 구글링을 해봤는데

Python Image Library [ PIL ] 가 있더군요

각종 image에 관한 함수들을 제공해줍니다

http://www.pythonware.com/products/pil/

설치를 하고 우리의 목적에 맞는 함수들을 찾아야겠죠

우리가 원하는 건

1. Image 파일 오픈

2. Image 파일 내의 특정 부분 RGB 값 얻어오기

3. 얻어온 RGB값의 chr 형 변화


이정도 입니다

PIL에서 해야 하는건 위 2개 정도 되겠죠

open 함수를 이용해서 파일을 열고

파일 내의 픽셀 값을 읽어오되 세로가 45 px 인 부분을 쭉 읽어들이면 될 것 같습니다

이 px 값은 그림판에서 간단히 확인하실 수 있습니다

또는 image 모듈의 size 를 이용하면 너비, 높이를 쉽게 알 수 있습니다

먼저 간단히 소스를 짜서 결과 값을 보도록 하죠




RGB와 255 값을 리턴해주고 모두 7번씩 반복되는군요

이걸 다시 문자로 바꾸면 되겠죠








저걸 다시 바꿔주시면 답이 나옵니다 :D

이걸 또 소스로 자동화 시켜볼까요

좀 복잡합니다

105,110 이부분은 일단 문자열로 인식되므로 정규표현식을 이용해서

추출한 다음에 int 형으로 형변환을 해주고 [ ASCII 로 변환 ] , 이를 다시 chr 형으로 변환 시켜서

join으로 합쳐야 합니다

Posted by LinkC

2010.03.28 19:45 WarGame


지난번에 이어서 crackme 풀이에 들어갑니다

실행해 보면 아무것도 뜨지 않습니다

트레이에도 남지 않는군요

프로세스를 확인해보면

멀쩡히 있는 것을 확인해 볼 수 있습니다



말그대로 이걸 실행 시켜야 하는데

Resource를 로드 하는 부분이 있어서

Resource Hacker로 들여다보니

다음과 같은 Dialog가 있었습니다




음 역시 패스 워드는 쉽게 드러나진 않는군요

프로그램 내부에서 연산 되서

저 Password 에 출력되는게 틀림없어 보입니다

Tracing 하면서 어디서 막히나 찾아보면

다음과 같은 루틴을 찾아낼 수 있습니다




멀티 스레드를 이용했군요

모든 스레드가 정상적으로 종료될때까지 무한정 대기 합니다

Timeout 을 0으로 바꿔줘서 우회하게 되면..



저번 문제와 비슷합니다

또 저 패스워드 부분을 연산하는 루틴이 따로 존재하고

올바른 값이 주어져야 저

패스워드가 올바르게 보이겠죠

저번 문제와 다르게 우리가 일반적으로 프로그램 상에서

입력해 줄 수 있는 부분은 없습니다

그렇다면 남은건 스레드 부분이라고 생각해서

스레드 실행 부분을 지정하는 함수 부분을 살펴보았습니다



LeaveCriticalSection 이 보이는군요

임계 영역을 해제하는 함수입니다

EnterCriticalSection 도 앞서 실행되겠죠

아무래도 한 스레드에서 Enter 한 Critical 영역을

다른 스레드가 참조해서 무한 대기 상태로 빠지지 않나 생각했습니다



일단 쭉 훑어보면

모든 스레드는 402020 함수를 각기 다른 인자로 호출하는데

LeaveCriticalSection 함수 인자로 미뤄보아 아무래도

402020 인자로 들어가는 ECX는 임계 영역의 주소를 나타내는거 같군요

각기 다른 영역을 Critical 영역으로 잡는데

무한 대기 상태에 빠지는걸 보면

다음 함수가 해결의 키 함수가 되겠네요

함수 내용입니다



Sleep  뒤에 익숙한 인자로 402020 함수를 호출합니다

저 인자들은 각각 2,3번째 스레드의 Critical 영역의 주소인걸 기억하시나요?

일단 전체적인 구조를 C로 나타내보면



Leave 를 호출해주지만..

이 스레드가 모두 실행 되고 다른 스레드가 실행 되길 바라는건 좀 억지가 있죠

Sleep의 시간을 0으로 줘도 다른 스레드로 넘어가 버리구요

그럼 Sleep 함수가 실행되지 않도록 NOP으로 채워줍시다



혹은 402020 의 EnterCriticalSection 부분을 무력화시켜도 될 것 같네요

아무튼 이런 식으로 각 스레드가 제대로 실행 되도록 하면

DeadLock 에 걸리지 않고 끝나게 됩니다





Posted by LinkC

2010.03.28 18:42 WarGame


문제 4번과 소스는 같습니다



분명 4번의 문제에 BOF 방어 기법이 추가 되어있는 것이겠죠

혹시 몰라 시도해봤습니다만

여지없이막히는군요

아마 stack 내에서 쉘 코드 실행은 막는 매커니즘이라고 생각됩니다

그럼 RTL 기법으로 한번 해볼까요



먼저 main 함수를 disasm 했을때 나온 결과인데

ebp가 아닌 esp로 인자들을 참조 하는 것을 볼 수 있습니다

ebp를 조절해서 공격하는 Fake ebp 보다

esp를 조절할 수 있는 Ret 를 이용해야 하겠죠

그럼 우리가 조작 해야 할 부분을 봅시다

다음은 func 함수의 EBP 부분입니다



노란색으로 칠한 부분이 바로 우리가 입력한 값이 들어있는 곳을 가리키는 포인터 입니다

2번째로 칠한 노란색 부분은 뒤에 00 부분도 있어 execl의 인자가 되기 적합하군요

그러니까 우린 0x8048568 부분을 참조하고 있는 곳을 앞으로 6단계 만큼 당겨야 합니다

 전에도 몇번 나온 적이 있었죠

RET을 이용합니다





그럼 전체적 코드의 구성을 살펴봅시다

1.execl 의 인자 [ /bin/sh ]

2 ebp까지 덮을 dummmy code

3. RET 코드 6번

4. execl 함수의 주소


execl 함수는 ctf4.codegate.org 에 접속해서

디버거를 실행하고 주소를 확인하시면 됩니다

물론 그 주소도 랜덤하지만 stack 에 비해서 상당히 좁기 때문에

몇번 하다보면 설정한 주소에 걸릴 겁니다

최종 코드는 다음과 같습니다

"/bin/sh\x00" + "\x90"*260 + "\x75\x85\x04\x08"*6 + "\xc0\x70\x1a\x00"




P.S 이 방법은 4번에서도 유효합니다

Posted by LinkC

2010.03.28 11:06 WarGame


문제 설명입니다

credentials: ctf4.codegate.org port - 9000, 9002, 9004, 9005, 9006 (you can choose any port)

BINARY FILE: http://ctf.codegate.org/files____/easy


해당 포트에 접속해보면



매우 간단해 보이네요

바이너리 파일은 위 주소에서 구할 수 있습니다

간단한 오버플로우 문제 같군요

먼저 hex ray로 소스를 보면




약간 꼬아놓긴 했습니다만 오버 플로우 취약점이 있다는 것은

누구나 매의 눈으로 찾아 낼 수 있습니다

일반적인 경우는 아니군요

쉘 코드를 집어넣을 적절한 장소가 필요합니다

마침 func 함수에 적절한 크기의 변수가 할당되어 있군요

할당된 크기를 보면 char형의 264크기의 배열이 할당되었다고 보시면 되구요

저기에 쉘 코드를 넣은 다음 RET을 시작 주소로 바꿔주면 되겠습니다만

요는 저 문제에 적용된 Overflow 방지 기법이겠죠

문제 2번에서 제공된 ID , PW 로 ctf4 서버로 접속해서 확인해보면




힙, 스택 주소가 계속 바뀌는걸 볼 수 있습니다

조금 전에 생각했던 RET 을 dest의 주소로 덮어씌우는 단순 방식은

정확한 stack 주소를 얻어내야 하기 떄문에

좀 어렵게 되었군요  

[ 윈도우에서도 Vista 부터 같은 원리의 기법이 적용된 바 있는데요

ASLR(Address Space Layout Randomization) 으로 불리며

Reversecore님의 잘 정리된 자료는

http://www.reversecore.com/69 에서 참고하실 수 있습니다 ]

이를 우회하는 방식은 발표 자료로 정리한게 있는데

http://linkc.tistory.com/entry/26-kernel-에서의-BOF

를 보셔도 좋구요

ASLR 우회 기법을 샘플 코드와 그림까지 첨부한 문서인

http://www-users.rwth-aachen.de/Tilo.Mueller/ASLRpaper.pdf

을 보시면 됩니다

문제 풀이에는 RTL  기법을 적용하는 방법이 있겠습니다만

이번 문제는 문제 자체 소스의 특성을 이용해 보도록 합시다

memcpy가 func 함수에서 가장 나중에 쓰인 것을 볼 수 있습니다

memcpy가 리턴값으로 Destination address를 준다는 건 혹시 알고 계신가요?

이를 이용해봅시다

그러니까 리턴값을 저장하는 eax는  Dest 의 주소를 가진다는 거겠죠

이 eax를 이용해 볼까요?




이런식으로 Exploit이 진행 될 수 있습니다

이제 전체적인 코드를 짜볼까요

먼저 필요한건

1. shell code

2. shell code와 eax를 채워줄 dummy byte

3. call eax 를 실행하는 text 영역의 주소


*이 3가지는 스택이나 힙 변화에 영향을 받지 않으므로

이 문제를 해결하는데 유효 합니다


먼저 ctf4 서버에 접속해서 reverse shell 이나 bind shell 등

뭐가 좋을까 봤는데

어째 문제 서버에서 외부로 연결이 잘 안되군요 -.-

애초에 문제 포트를 빼고 외부로의 연결을 막아놓은 건지는 잘 모르겠습니다만

저는 reverse shell 을 하되 주소를 127.0.0.1 으로 주어 서버 자신의 포트로 reverse telnet 을 걸었고

서버에 미리 접속해서 그  특정 포트에서 응답을 대기하도록 했습니다

dummy byte는 shell code + dummy byte = 264 byte

로 간단히 쉘코드 길이를 계산해서 넣으면 되겠쬬

그다음은 call eax 를 실행하는 text 영역의 주소가 필요합니다

이는 IDA 를 사용하거나 Metasploit을 이용하면 되겠군요






두 주소 모두 같은 명령어니까 아무거나 집어넣어도 상관 없습니다

0x080484df를 이용해봅시다




문제 서버에 접속해서 미리 포트를 열고 대기하고

공격을 하면...






P.S

http://coma.0x3f.net/uncategorized/codegate2010-ctf-level-4

에서 풀이도 봤습니다

쉘 코드가 264 byte에 충분히 들어가지만

안들어가는 경우를 생각했던건지

다소 복잡하지만 재밌는 방법을 사용했더군요








Posted by LinkC
이전버튼 1 2 3 4 5 이전버튼

블로그 이미지
LinkC

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

공지사항

Yesterday21
Today22
Total330,165

달력

 « |  » 2019.7
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

최근에 받은 트랙백

글 보관함


. .