목록Wargame (35)
농소
네 다음 레벨의 문제를 보니 이번엔 추가적으로 buffer hunter라고 버퍼메모리를 못쓰게 막아놨네요그런데 이전에 저는 환경변수 메모리를 이용했으므로 그대로 이용해 줍시다. 이전문제랑 똑같은 명령어를 넣으면 쉽게풀립니다. * 시작주소는 달라질 수 있습니다.
이번에는 egghunter라는 방어책을 하나 추가시켰네요 그리고 첫번째 인자의 47번째 문자('\xbf')가 아니면 강제로 종료가 되네요그런데 버퍼의 크기가 buffer(=40byte), ebp(=4byte), eip(=4byte)저 47번째 위치는 eip가 들어가는 주소이기 때문에 어차피 bof를 할 때 저 위치에는 '\xbf'가 와야 하므로 딱히 신경 쓸 필요는 없는 것 같습니다. gdb로 확인한 결과 eip의 첫주소엔 bf가 들어갈 수 밖에 없습니다. payload $(python -c 'print "" * 44 + "" + "" ')특정문자에 nop을 쓰면 주소를 찾기 쉬우니 쓰시면 더 편하실겁니다. 쉘코드를 넣어주고 쉘주소를 설정하여 실행한 결과 정상적으로 쉘이 실행 되었습니다.
다음 gobilin 파일의 문제입니다. 이번에는 인자가 아닌 표준입력으로 bof를 해야하는 문제입니다. 크기를 보니 버퍼공간에 쉘코드를 삽입 할 수 없으니환경변수에 쉘코드를 넣도록 하겠습니다. payload (python -c 'print "" * 20 +"" + ""';cat) | ./goblin
이어서 2번 문제 입니다. 이전 문제에서 추가적으로 방어기능을 만들었네요 버퍼크기를 줄여 쉘코드를 버퍼에 삽입할 수 없게 만들었습니다. 보시다 시피 버퍼내부에는 쉘코드를 넣을 공간이 모자랍니다.그래서 저는 버퍼 공간이 아닌 환경변수들이 들어가는 공간에 쉘코드를 삽입하여 공격하겠습니다. payload $(python -c 'print "" * 20 +"" + ""')
이번에는 bof원정대 문제를 풀어보려합니다. 초반부라 그런지 기본적인 bof문제입니다. gdb로 본 결과 260byte를 채우면 eip값을 변조 할 수 있겠군요변조하여 쉘코드를 실행해줍니다. 정상적으로 쉘이 실행되면서 권한상승이 되었습니다.
이어서 level 2문제를 풀어보죠 두번째 인자를 이용해 eip를 변조하여 쉘코드를 실행하게 만드는 간단한 오버플로우 문제네요 우선 c로 볼 때 buf 값이 128이라 128만 채우면 되는줄 알았지만 gdb로 본 결과 eip까지 도달하기 위해선 140byte의 공간을 사용해야하네요 쉘코드 삽입과 eip에 쉘코드 주소를 넣어줍니다. 16바이트씩 주소를 변형해가면서 실행한 결과 쉘이 실행되고 eui가 변형된것이 확인이 되었습니다. 비밀번호를 알았으니 다음단계로 가볼게요
level1 - > level2 시작해보겠습니다 이번에도 c파일을 열어서 무슨 취약점이있는지 봅시다. 환경변수 egg변수의 값이 null이면 종료되고 아니라면 egg변수값을 가져와 실행을 하네요.그렇다면 egg환경변수에 쉘코드를 작성해서 실행시키면 될 것 같습니다. 이런식으로 egg변수에 쉘코드를 넣고 실행 시켜주었습니다.그런데 왜인지는 모르겠지만 쉘은 실행이 되었지만 권한상승이 안되었네요이럴경우 방법은 2가지가 있습니다 1. 쉘코드 전 setreuid를 추가해 준다. 2. 쉘코드가 아닌 cat코드를 삽입하여 비밀번호를 본다. 두가지 중 무엇을 하든 자기가 편한걸 선택하시면 되지만저는 연습도 할겸 이 2가지 방법을 모두 해보도록 하겠습니다. 1. 쉘코드앞에 setreuid를 추가 xor eax, eax ..
leviathan 다음으로 narnia라는 워게임을 해보겠습니다. 난이도는 10중에 2로 입문자 들도 쉽게 할 수 있는 난이도 인것 같네요 데이타는 /narnia에 있다고하고 여기에는 안나와있지만 password는 /etc에 존재했습니다.자 이제 시작해 보도록 하겠습니다. narnia 폴더에 가보면 한번에 10개의 문제가 존재하네요 권한을 한단계씩 올리면서 마지막 문제까지 푸는 방식입니다.친절하게도 풀기 쉽게 c파일까지 같이 주네요 우선 narnia0.c 를 cat으로 보았습니다.val이라는 변수에 0xdeadbeff라는 값이 들어가야 setreuid와 쉘이 실행되네요간단한 오버플로우 문제네요 buf에 20개의 문자를 넣고 다음에 0xdeadbeef를 넣어주면 될듯합니다. 자 넣었더니 생각한대로 권한이 ..
6단계 시작해보도록 하겠습니다. 전과 같이 홈디렉터리에 실행할 수 있는 setuid 파일이 있습니다. 실행해봤더니 4 digit code 라는 힌트를 친절하게도 내뱉네요ltrace로 해보았더니 input함수가 없으므로 두번째 argv를 이용해야하는것 같습니다.2번째 argv로 1234를 넣었더니 wrong 이라고 내뱉네요brute force 공격을 하면 0000 ~ 9999 까지 금방하겠지만저는 gdb를 이용해서 패스워드를 찾아보겠습니다. 머 일일히 다 볼 필요는 없고 패스워드를 비교하는 문제니까 cmp명령어를 주로 보면 될 것 같네요 첫번째 cmp는 인자가 2개인지 체크를 하네요 별볼일 없으니 다음으로 넘어갑니다. 자 여기서 입력값과 esp+0x1c의 메모리값과 비교를 하네요 이 esp+0x1c이 무엇..
이어서 5단계 문제를 풀어보겠습니다 홈디렉터리에 실행파일이 있네요 실행해 봤더니 /tmp/file.log를 찾을 수 없다고 나옵니다.ltrace로 실행시켜봤더니fopen함수를 실행시키고 있습니다.해당파일이 존재하지 않는것 같네요 생성해봅시다. 해당파일을 생성하고 다시 ltrace로 실행해 봅니다. 파일을 열고 fgetc 함수를 실행시키네요 무엇인가 문자를 출력해주는것 같습니다. 실행이 끝나고나면 파일이 삭제되니 다시 만들어주시고 그안에 문자를 넣어보겠습니다. 네 파일내용을 문자 하나하나씩 출력해주고있는 모습이네요 패스워드파일에 링크를걸고 실행했더니 안에들어있던 패스워드를 출력해 줍니다.