'Wargame > Natas:OverTheWire' 카테고리의 다른 글

[Natas] Level5  (0) 2016.10.22
[Natas] Level4  (0) 2016.10.22
[Natas] Level3  (0) 2016.10.22
[Natas] Level2  (0) 2016.10.22
[Natas] Level1  (0) 2016.10.22

PythonChallenge

Level0



심심해서 예전부터 해보고싶었던 pythonchallenge를 시작해봅니다.



0레벨입니다.

모니터에 238이 적혀있네요.

힌트로는 URL을 바꿔보라고 합니다.



238.html로 URL을 바꿔주었더니 38은 2의 약간 위에 있다고 하네요.



힌트가 더 필요하여 첫 페이지가 0.html이었으니 1.html로 들어가보았습니다.

2**38이라고 힌트를 주었네요.

위에서 말한 2보다 약간 위에 있는 38은 2의 지수를 말한 것이었습니다.

python에서 2**38을 입력하면 274877906944라는 결과가 나옵니다.



[*] FLAG : 274877906944.html



'Wargame > PythonChallenge' 카테고리의 다른 글

[PythonChallenge] Level5  (0) 2016.06.27
[PythonChallenge] Level4  (0) 2016.06.27
[PythonChallenge] Level3  (0) 2016.06.27
[PythonChallenge] Level2  (0) 2016.06.27
[PythonChallenge] Level1  (0) 2016.06.27

OverTheWire Behemoth 

[level0 -> level1]



OverTheWire Behemoth의 첫 번째 문제입니다.




다른 난이도와 동일하게 /behemoth 디렉토리에 문제가 자리 해 있습니다. 하지만 다른 난이도와 다른 점이 있다면 원본 소스코드를 지원 해 주지 않는 다는 점이 있겠네요. 

현재 behemoth0 계정이므로 behemoth0 바이너리를 실행시켜보았습니다. 패스워드를 요구하며, 패스워드가 맞지 않을 경우 Access denied.. 를 출력하며 프로그램을 종료시킵니다. 만약 지정된 패스워드를 입력 할 경우 쉘이 떠지는 방식인 것 같습니다.

gdb로 루틴을 확인 해 보도록 하겠습니다.



main 함수를 disassemble 한 결과, 중간에 strcmp 함수(두 번째 네모 박스)가 있는 것을 확인 할 수 있습니다. esp+0x1f와 esp+0x2b를 비교하는데, esp+0x2b는 위의 scanf에서 받아오는 문자열이 저장 된 위치입니다. 그리고 esp+0x1f는 시작 부분에서 0x475e4b4f에 있는 문자열을 저장 해 놓은 위치입니다. 이 문자열은 암호화 된 상태로 입력되었으며, 첫 번째 네모 박스에 있는 memfrob 함수를 이용하여 복호화합니다. 다음은 memfrob 함수의 원형입니다.



 void * memfrob(void *s, size_t n); 


문자열 s의 각 요소를 '42'와 XOR 하는 함수입니다. 무조건 '42'와 XOR 하기 때문에 암호화라기 보다는 문자열을 숨기기 위한 임시 방편이라고 생각 하는 편이 좋을 것 같습니다. 처음 memfrob을 사용하면 원래의 문자열을 xor 하여 암호화 하고, 다시 memfrob 함수를 사용하면 복호화 되는 방식입니다. 위에서 설명 했듯이, esp+0x1f에 입력 되어 있는 문자열은 memfrob함수로 이미 암호화 된 값이 들어가 있기 때문에 첫 번째 네모 박스에서 복호화를 진행하는 과정이라고 생각하면 되겠습니다.

이 복호화 된 값과 입력 받은 값을 strcmp 하여 값이 같지 않으면 main+195로 점프하여 프로그램을 종료시키네요. 분기하지 않았을 경우는 main+188(세 번째 네모 박스)에서 execl을 호출하는 것으로 보아 쉘을 떨어뜨려주는 것 같습니다.

그럼 memfrob 함수를 호출 한 이후에 breakpoint를 걸어 esp+0x1f에 들어있는 문자열을 확인 해 보도록 하겠습니다.



저는 main+129의 위치에 breakpoint를 걸어주고 값을 확인 했습니다.

해당 위치에는 "eatmyshorts"라는 문자열이 들어 가 있었습니다. 이 문자열을 바이너리를 실행 했을 때 패스워드 부분에 입력 해 주면 쉘이 떨어 질 것 같습니다.



- password : eatmyshorts




예상대로 Access granted.. 라는 메시지를 띄워주면서 쉘을 뱉어냈습니다. behemoth1 권한을 가지고 해당 레벨로 가는 패스워드를 얻어냈습니다.


'Wargame > Behemoth:OverTheWire' 카테고리의 다른 글

OverTheWire Behemoth [level2 -> level3]  (0) 2016.04.29
OverTheWire Behemoth [level1 -> level2]  (0) 2016.04.28

OverTheWire_Wargame Narnia

[ level0 -> level1 ]


Bandit와 Leviathan을 지나 드디어 Narnia로 넘어왔습니다.

level0부터 바로 시작하도록 하겠습니다.


OverTheWire 웹페이지 narnia 카테고리를 눌러보면 하단에 위와 같은 문구가 있습니다.

지금까지는 보통 홈 디렉토리에 다음 레벨로 넘어갈 수 있는 바이너리나 정보가 있었는데, 이번에는 /narnia/ 디렉토리에 전부 몰려있는 듯 합니다.

/narnia/ 디렉토리에서 level1로 넘어갈 수 있는 정보를 찾아보도록 하죠.



홈 디렉토리에는 아무 정보도 있지 않고, /narnia 디렉토리로 가 보니 level8까지의 정보가 모두 들어있습니다.

바이너리와 소스코드 모두 주어져 있으니 narnia0.c를 살펴보도록 합시다.



첫번째로 long형 데이터인 val이 'AAAA'로 선언 되어 있으며, buf변수는 20바이트로 선언이 되어있습니다. 그리고 쉘을 띄워주는 조건으로 val 변수가 0xdeadbeef가 되길 원하고 있습니다. 바로 위의 scanf 부분에서 24바이트만큼 입력을 받는 것을 보니 char 배열과 long형 변수 사이에 dummy byte는 따로 없는듯 합니다. 바로 20바이트 dummy + 0xdeadbeef를 입력해주면 쉘이 띄워질 것 같습니다.



짜잔!

OverTheWire_Wargame Leviathan

[ level0 -> level1 ]


Leviathan 시작합니다.



홈 디렉토리를 확인하니 backup 폴더가 숨김 속성으로 고스란히 자리잡고 있습니다.

들어 가 보니, bookmarks.html 파일이 하나 있는데, 용량이 큰 것으로 봐서 cat으로 출력하면 있던 답도 노답이 될것만 같습니다.

grep으로 왠지 있을것만 같은 leviathan을 필터링 해 봅시다.



아니나 다를까, leviathan1의 패스워드를 뱉어줍니다.

OverTheWire_Wargame Bandit


[ level0 -> level1 ]


LOB FC3를 클리어 하고, OverTheWire를 시작했습니다.

가장 쉽다고 하는 Bandit 난이도부터 시작하겠습니다. Level0입니다.



bandit0 계정에 접속하면 home directory에 readme라는 파일이 있습니다.

cat 명령어로 파일을 읽어주면 Key값이 나타납니다.

해당 값을 복사하여 bandit1 계정의 패스워드로 입력해주면 정상접속 되는 것을 확인 할 수 있습니다.

+ Recent posts