목록Wargame (116)
cgy12306

ID : orge PW : timewalker 파일을 확인해 보자. darkelf에서는 인자를 여러개 넘길 수 있었지만 이제는 인자를 두개밖에 넘기지 못한다. 그러면 파일명(argv[0], 첫번째 인자)에 어떠한 작업을 해야할 듯 하다. ./파일명 `python -c 'print "A"*44+"\xbf\xbf\xbf\xbf" leave에 breakpoint를 걸고 실행해 보자. 버퍼와 인자를 비워주지만 파일명은 그대로 남아 있는 것을 볼 수 있다. 그러면 파일명을 쉘 코드로 바꿔주면 내부에서 쉘 코드가 실행될 것 같다. \xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1..

ID : darkelf PW : kernel crashed 파일을 확인해 보자. wolfman과 달라진 점은 argv[0]의 길이가 77이어야 한다. 첫번째 인자는 파일의 이름 또는 경로로 길이를 지정해 줄 수 있다. ./~~~/../orge 2 + ~~~ + 8 = 77 이 되야한다. ~~~는 67글자인 디렉토리 이어야 한다. 길이 비교하는 분기문을 통과한 것을 볼 수 있다. 이제 wolfman 문제처럼 해결 해보자. 적당히 bffffb0c를 선택해서 코드를 작성하자. 쉘을 획득했다. 비밀번호는 timewalker이다.

ID : wolfman PW : love eyuna 이번 문제는 에그 쉘 사용x, 버퍼 초기화, 인자 길이 검사를 한다. 넘겨받는 인자(argv[1])가 48이 넘어가면 종료가 된다. 하지만 우리는 인자를 여러개 넘겨줄 수 있다. argv[2]를 이용할 것이다. 쌍따옴표 사이에 공백을 넣어주게 되면 다음 인자로 넘어간다. A를 44개 넣어주고 \xbf를 4개 넣어준후 뒤에 한 칸 띄어줘서 공백을 만들고 그다음 A를 300개 넣어준다. 41(A)가 잘 들어갔다. 적당히 주소 bffffb5c를 선택하자. 쉘을 획득했다. 비밀번호는 kernel crashed이다.

ID : orc PW : cantata wolfman 파일을 열어보자. 안쪽 버퍼를 지워주고 에그쉘을 사용 못하게 해주는 기법이 걸려있다. goblin 문제처럼 풀면 될것같다. 페이로드는 버퍼(40) + SFP(4) + ~~~\xbf + nop + 쉘코드 이다. 먼저 bf를 48개 넣고 A를 300개 넣어서 메모리를 확인한다. bf가 48개 들어가고 뒤에 41(A)가 들어가 있는 것을 볼 수 있다. 적당히 bffffb7c를 선택해서 코드를 작성해보자. 쉘을 획득했다. 비밀번호는 love eyuna이다.

ID : goblin PW : hackers proof orc 파일을 열어보자. 인자로 넘겨받은 값이 48바이트째에 \xbf가 아니면 종료가 되고 \xbf면 인자로 넘겨받은 값을 버퍼에 strcpy로 복사하는 코드이다. 에그쉘 또한 막혀있다고 한다. 그러면 gate 문제처럼 nop sled 기법을 사용하면 될 것 같다. 대충 페이로드를 구상해 보면 버퍼(40) + SFP(4) + ~~~\xbf + nop + 쉘코드 이다. bf를 48개 넣어주고 그 뒤에 A를 300개 넣고 확인해 봤다. bf가 48개 들어가고 41이 계속 들어가 있는 것을 볼 수 있다. 적당히 bffffb60을 선택해서 코드를 작성하자. 쉘 획득에 성공했다. 비밀번호는 cantata이다.

ID : cobolt PW : hacking exposed 파일을 확인해보자. 버퍼를 16byte만큼 할당해주고 gets로 buffer를 입력받는다. gets도 버퍼오버플로우 취약점이 존재한다. 디버깅 해보자. 버퍼를 16만큼 할당해주는걸 볼 수 있다. gremlin처럼 풀면 될 것 같다. 환경변수에 쉘코드를 넣어주고 쉘코드의 주소를 알아내는 코드를 작성하고 실행한다. 명령어는 (python -c 'print "A"*20 + "\xc7\xfe\xff\xbf"'; cat) | ./goblin 이다. FTZ에서 봤듯이 매개변수를 이용해서 값을 복사하는 strcpy와는 달리 표준입력을 이용하는 gets를 쓰기 때문에 파이브를 이용하고 쉘주소가 있는 곳을 실행한 후 cat으로 명령어를 입력할 수 있게 해준다. ..

ID : gremlin PW : hello bof world 파일을 확인 해 보자. 버퍼를 16byte만큼 할당해 준다. 이러면 gate문제에서 쉘코드 길이가 25byte여서 명령어 안에 넣어줄 수 없다. 그러면 환경변수 안에 쉘코드를 넣어주고 쉘코드의 주소를 알아내서 ret에다가 그 쉘코드 주소를 넣어주는 방법을 생각해 볼 수 있다. 디버깅을 해보자. 버퍼를 16만큼 할당 해주는걸 볼 수 있다. 그러면 A를 16(buffer) + 4(SFP)만큼 덮어주고 ret에 쉘코드 주소를 넣어주면 되겠다. 우선 쉘코드를 환경변수에 넣어보자. 쉘코드의 주소를 알아보자. c코드를 작성한다. 주소는 0xbffffec5이다. 그럼 이제 명령어를 입력해보자. ./cobolt `python -c 'print "A"*20 +..

ID : gate PW : gate 파일 목록을 확인해보니 gremlin이라는 실행 파일과 C파일이 있다. C파일을 열어보자. 버퍼를 256byte 만큼 할당해준다. 인자가 1개면 argv error를 출력하고 종료하며 아닐 경우 두번째 인자를 strcpy함수를 이용해 buffer에 넣고 buffer를 출력하는 코드이다. strcpy는 문자열의 길이를 검사하지 않고 그대로 복사하기 때문에 버퍼오버플로우에 취약할 수 있다. 디버깅 해보자. 256(0x100)만큼 버퍼를 할당해주고 strcpy 함수를 호출하는걸 볼 수 있다. 시나리오를 작성해보면 256(버퍼) + 4(SFP)를 덮어주고 ret에다가 다른 주소를 넣어 쉘코드를 실행 시킬 것이다. NOP sled 기법을 사용할 것이다. NOP sled 는 NO..