정보보안/FTZ 썸네일형 리스트형 [FTZ]level20 힌트를 보면 printf에 포맷을 쓰지 않고 사용을 하였다. 이를 이용하여 포맷스트링 공격이 가능 할 것이다. 포맷 스트링 공격이란 위와 같이 %x~%n등을 이용하여 printf가 프로그래머가 사용한 서식자인지 인식하고 내용을 읽어 내는 취약점이다. 먼저 printf함수의 소멸자의 위치를 알아낸다 이 위치가 쉘코드가 들어갈 곳이다. 전과 마찬가지로 환경변수를 설정해 놓는다. 0xbffffc32 0xbfff (49151) -> 0x0804959a 0xfc32 (64562) 64522 -> 0x08049598 다음 주소를 반으로나누어 목표하는 0x08049598에 둘로 나눠서 입력하게 될것이다. 포맷스트링 공격 형식은 다음과 같을 것이다 (python -c 'print "AAAA\x98\x95\x04\x08.. [FTZ]level19 코드가 매우 짧은걸 볼 수 있다. 너무 짧아서 무엇이 부족한지 몰랐다. 평소대로 환경변수를 이용하여 buffer overflow를 이용하여 풀렸지만 다른 사람들의 풀이를 읽어보고 무엇이 부족한지 알 수 있었다. 지금까지 사용해 왔던 shellcode에는 setuid가 포함되어 있었기 때문에 생각하지 못했던 것이다. 문제를 다시보면 setuid가 존재하지않고 system역시 존재하지 않는다. 따라서 이러할때 사용할 수 있는 공격방식으로 RTL(Return to Library)가 존재한다. 자세한 내용은 나중에 따로 다시 정리해 보고자 하지만 간단히 내용을 살펴 보자면 위의 분석한 내용과 같이 setreuid, system 함수는 프로그램이 실행 될때 어딘가의 library에 존재하기 때문에 이를 ret a.. [FTZ]level18 문제 힌트를 보면 다음과 같이 긴 코드가 보인다. 조건을 보면 check 안에 0xdeadbeaf가 있을때 shellcode를 실행해 준다. 그렇게 하기 위해서 입력받은 값에 따라 switch문이 동작하는 것을 볼 수 있다. 취약점은 string[count] = x 부분에서 생긴다 count가 만약 음수라면 자신보다 뒤에있는 변수에 접근 가능하기 때문이다. disas한 부분을 보면 deadbeef와 비교하는 부분은 ebp - 104 string 부분은 ebp - 100 이다. 만일 입력받은 명령어가 0x08 이라면 count-- 되는 점을 이용해서 string[-1], string[-2] 등에 접근할 수 있다. 그리고 이는 check 부분에 해당한다. [FTZ]level17 이전 문제와 다르게 shell()함수가 없다. 하나의 방법으로 이전에도 소개한 환경변수를 이용한 방법이 있고 실제로 내가 그렇게 해결했다. 다음 방법으로는 버퍼에 쉘코드를 입력하여 주소를 넣는 방식이 있을 것이다. [FTZ]level16 코드는 다음과 같다. 함수 포인터가 printit 함수를 호출하는데 이를 shell이 호출하게 하면 쉘을 얻을 수 있다. gdb로 분석을 해봤을때 printit의 주소가 80496e8인 것같다. 아마 shell()함수도 주변에 있을듯 하여 이를 찾아보았다. 다음과 같이 검색하여 shell의 위치도 찾을 수 있었다. (python -c 'print "\x90"*40+"\xd0\x84\x04\x08"'; cat) | ./attackme 이전과 같은 방식으로 shell()함수의 위치를 덮어 씌워줬다. [FTZ]level15 14단계 문제와 같아 보이지만 check이 포인터 변수인 것이 다르다. 포인터 변수로 되어있다는 것은 값이 deadbeef 여야 된다가 아니라 가르키는 주소의 값이 deadbeef 여야 된다는 것이다. gdb로 전과 같이 분석했을 때 deadbeef 를 하드 코딩하여 비교하고 있기 때문에 main 부분의 메모리를 살펴보면 다음과 같이 dead beef가 저장 되어있는 모습을 알 수 있다. (python -c 'print "\x90"*40+"\xb2\x84\x04\x08"';cat) | ./attackme 따라서 다음과 같이 코드를 입력하여 해결 할 수 있다. 이 외에 check 이 들어가는 부분을 환경변수를 이용하여 처리 할 수 도 있다. [FTZ]level14 이 문제 같은 경우 전 문제와 비슷한것 같지만 disassemble해보면 입력받을수 있는 크기는 45지만 메모리에할당하는크기 56으로 더 커서 ret에 덮어씌울수가 없다. 따라서 해당문제 코드를 다시 읽어보면 메모리에 할당된는 주소를 이용하여 check에 0xdeadbeaf를 집어 넣는 것이다. 코드를 알고 있기 때문에 위와 같은방식으로 코드를 작성해서 실질적으로가 포인터가 어디를 가리키고 있는지를 알 수 도 있겠지만 이는 사용하기 어렵다. 다시 gdb를 보면 29번째 줄에서 ebp - 16 위치에서 deadbeef 랑 비교하는 부분을 참고하면 그 부분이 check인 부분일 것이라고 의심 할 수 있다. 따라서 다음과 같은 코드를 이전과 같이 쓸 수 있다. [FTZ]level13 다음 역시도 버퍼오버플로우문제이다. 스택카나리(스택가드)에 관한 내용인 것 같다. 스택에 i에 해당하는 부분이 0x1234567로 변하지 않는지 체크하는 것이다. 이전 과 같이 무식하게 넣는 방식으로는 버퍼오버플로우가 나기 때문이다. 분석한 내용을 기반으로 메모리를 그림으로 그려보았다. 색칠 된 부분에 0x1234567이 들어 갈 것이다. 틀리면 다음과 같이 나온다. 다시 제대로 계산해서 답을 넣어보니 결과가 잘 출력되었다. 이전 1 2 3 다음