목록Wargame/FTZ (20)
cgy12306
ID : level20 PW : we are just regular guys hint 파일을 열어보면 bleh에 80만큼 할당해주고, fgets으로 bleh의 79바이트 만큼 입력을 해주게 된다. bleh변수에 79바이트 만큼 할당해주면 BOF를 사용할 수 없게된다. 일단 디버깅 해보자. 메인 심볼이 없어서 디스어셈블을 할 수 없다고 한다. 다시 hint 파일을 보면 printf(bleh);부분이 있다. 원래 c언어를 했었다면 printf("%s", 변수); 이렇게 작성을 했었을텐데 printf(bleh)이 적혀있다. 이 코드는 FSB의 취약점이 있다. FSB 취약점은 Format String Bug의 약자이다. 우선 포맷스트링의 종류이다. 파라미터 변수형식 %d 정수형 10진수 상수 %f 실수형 상수(..
ID : level19 PW : swimming in pink gets의 취약점을 이용한 버퍼오버플로우이다. 디버깅 ㄱㄱ 40byte+ SFP(4byte)= 44byte이다. 44byte만큼 A를 넣어주고, ret에 쉘코드가 들어있는 환경변수의 주소를 넣어주면 된다. 기존의 있던 쉘코드를 그대로 이용해봤지만 uid가 level19이다. 여태 이용했던 쉘코드의 내용은 /bin//sh로 쉘을 획득하는 거지만 이번 attackme의 c 코드를 확인해보면 setreuid로 uid를 얻는 것이 없다. 그러면 level20의 uid를 확인하고 쉘 코드에 level20의 uid를 얻어주는 코드를 넣어주면 된다. (RDH님의 도움) level20의 uid는 3100이다. setreuid(3100,3100)을 포함하는 ..
ID : level18 PW : why did you do it check와 deadbeef와 비교해서 같으면 shellout 함수를 호출해서 쉘을 획득하는 것 같다. 이 부분을 보면 x버퍼에 1바이트씩 읽어서 스위치 문을 돌린다. x에 0x08이면 count-1을 해주고, 일반적인 값이 들어오는 경우 string[count]위치에 x를 넣고 count+1을 해준다. 디버깅을 해보면 main+91에서 ebp-104와 0xdeadbeef를 비교하는 것을 보면 ebp-104 부분은 check변수가 들어가는 곳 임을 알수 있다. 이 부분은 switch문의 영역이다. main+444부분을 보면 epb-2520와 0x8과 비교한다. ebp-252에 x가 들어가는 것을 알 수 있다. 그리고 0x8048731을 따라..
ID : level17 PW : king poetic 이번에도 버퍼오버플로우이다. main+6에서 ebp-16지점에 0x8048490을 넣어주고, main+57부분에서 ebp-16지점의 값을 eax를 넣고 eax를 call 해준다. 스택을 보면 이렇다. 16번에서 숫자만 살짝 바꿨다. 그러면 ebp-16지점에 쉘 코드가 들어있는 주소를 넣어주면 쉘이 실행될것 같다. 쉘 코드를 환경변수에 등록하고, 쉘 주소를 알아보자. 쉘 코드가 들어있는 주소를 획득했다. A를 40byte만큼 넣어주고 쉘 코드가 들어있는 주소를 넣어 실행시켜보자~~~ 비밀번호는 why did you do it이다.
ID : level16 PW : about to cause mass 이번에도 버퍼오버플로우 문제인듯 하다. 디버깅을 해보자. main+6을 보면 ebp-16지점에 0x8048500를 넣는다. 참고로 8048500은 printit의 함수의 시작주소이다. main+36부분에서 ebp-16지점에 있는 값을 eax에 넣고 main+39에서 eax를 호출한다. main 함수를 한 줄씩 실행해보자. 우선 main에 break point를 걸어주고, r으로 프로그램을 실행하고, ni로 한 줄씩 실행해보자. print해주는 함수가 실행된다. c 코드에서 shell함수를 우리가 호출해야하는데 ebp-16지점에 shell 함수의 시작지점을 넣어주면 될 듯 하다. shell 함수의 시작주소는 0x080484d0이다. 그러면..
ID : level15 PW : guess what 14번이랑 다른점은 포인터를 이용한다는 점이다. 디버깅 해보자. 14번과 유사하다. 하지만 main+32 부분을 보면 eax 주소안의 있는 값과 0xdeadbeef와 비교한다. 이 부분이 제일 헷갈렸다. 나의 이해 방식은 main+32 부분에서 DWORD PTR[eax]를 그냥 eax로 바꾼다면 ebp-16의 위치에 있는 값과 0xdeadbeef와 비교를 하는 것이다. 그러면 ebp-16에 0xdeadbeef를 넣으면 되겠지만 현재의 문제는 DWORD PTR[eax]와 0xdeadbeef를 비교하는 것이다. 그러면 ebp-16의 위치에 0xdeadbeef가 있는 주소값을 넣어주면 해결 된다. 우선 스택구조는 이렇다. 저 ebp-16 자리에 0xdeadb..
ID : level14 PW : what that nigga want? 디버깅을 해봅시다. main+29부분을 보면 ebp-16이 0xdeadbeef와 비교하는 것을 볼 수 있다. 스택을 그려보자. (저는 아날로그적인 것을 좋아합니다) A를 40byte 만큼 넣어주고 다음 0xdeadbeef를 넣어준다. 0xdeadbeef를 넣어줄 땐 리틀 엔디안 방식으로 넣어준다. 우선 쉘코드 작성하고 쉘코드 주소를 알아내자. 주소를 얻었으니 코드를 작성해보자. 비밀번호는 guess what이다.
ID : level13 PW : have no clue 이번에도 버퍼오버플로우 취약점을 이용한 문제이다. 디버깅을 해보자. 버퍼를 1048byte만큼 할당을 해준다. 그러면 일단 A를 1048byte 넣어보자. Buffer Overflow 라고 프린트된다. main +69 부분을 보게 되면 ebp-12와 0x1234567을 비교하는 것을 볼 수 있다. 그러면 우리는 ebp-12부분에 0x1234567을 넣어주면 된다. strcmp함수가 호출되기 전까지 스택을 그려보자. A를 1036byte를 넣어주고 이후에 0x1234567을 넣고 다시 A를 ebp까지 덮어준 후 ret부분에 쉘 코드 주소를 넣어주면 될것 같다. 해보자. 쉘 코드 환경변수에 넣어주고 주소를 알아내는 c코드를 작성 주소를 얻었다. 이제 명..