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 |