ftz

드디어 마지막 문제입니다.attackme의 소스코드를 보면 배열의 크기를 80으로 선언하였지만 79바이트로 입력을 제한하였으므로 오버플로우가 불가합니다.그러나 printf()애서 발생하는 포맷 스트링 버그로 리턴 값을 덮을 수 있습니다. -------------------------포맷 스트링 ? 포맷 스트링 익스플로잇은 프로그램을 충돌시키거나 악의적인 코드를 실행 시키는데 사용될 수 있다. 문제는 포맷팅을 수행하는 printf() 같은 특정한 C 함수들에서 검사되지 않은 사용자 입력을 포맷 스트링 파라미터로 사용하는 것으로부터 나온다. 악의적인 사용자는 %s와 %x 포맷 토큰들을 콜 스택 또는 메모리의 가능한 다른 위치의 데이터를 보이게 하는 데 사용할 수 있다. 또한 %n 포맷 토큰을 사용해서 임의적..
힌트 파일을 열어 attackme의 코드를 봅시다.이번 문제의 핵심은 바로 0x08을 받으면 count가 -1이 되는 것 입니다. main+3에서 100바이트의 메모리를 할당했습니다.main+91을 보면 ebp-104와 0xdeadbeef를 비교하는데 이는 ebp-104가 check라는 것을 의미합니다. 메모리의 구조는 string[] = ebp - 100check = ebp - 104x = ebp - 108...대충 이렇게 생긴 것 같습니다.여기서 주목해야할 점은 string이 check보다 위에 있다는 것 입니다.string[-4] = check가 성립될 수 있습니다.따라서 페이로드는 0x08을 4번 채워준 후 0xdeadbeef를 채워주면 됩니다! 끝!
attackme의 코드를 살펴보면, shell함수가 없는 것을 확인하실 수 있습니다.그렇기에 환경변수에 쉘코드를 넣고 그 쉘코드의 주소 값을 메인함수의 리턴 값 (call함수가 호출하는 값) 으로 받아오면 됩니다. 메인함수를 들여다보니, call함수 초기화를 ebp-16에서 해주고 fgets함수로 56바이트를 받습니다.이는 40바이트의 쓸모없는 값을 채워주고 쉘코드를 넣은 환경변수의 주소를 채워주면 된다는 뜻 입니다. 이렇게 환경변수를 만들어 줍니다. 환경변수의 주소를 구하는 코드입니다.getenv()함수로 얻어오는 주소의 오차범위를 좀 더 줄이기 위한 코드입니다. 주소를 확인해줍니다. 쓸모 없는 값으로 40바이트를 채워준 뒤 구한 주소 값을 넣어 shell을 얻었습니다.
attackme의 코드를 살펴보았습니다.level14랑 다른 점은 포인터를 사용하였다는 것 밖에 없는것같습니다.즉, 0xdeadbeef의 주소를 찾아서 if문을 만족시켜주면 되는 문제입니다. level14와 마찬가지로 56바이트만큼 입력받고, ebp-16부터 검사해줍니다.우선 0xdeadbeef의 주소부터 알아냅시다. 0x080484b0~0x080484b2 까지 살펴보았습니다.사진처럼 0x080484b2에 deadbeef가 저장되 있는 것을 보실 수 있습니다. (python -c 'print "\x90"*40 + "\xb2\x84\x04\x08"';cat)|./attackme 끝!
lim.dev
'ftz' 태그의 글 목록