ftz풀이

attackme의 코드를 봅시다.권한을 올려주는 코드가 보이지않습니다.이는 setreuid코드를 직접 쉘 코드로 짜와야 한다는 뜻입니다.. 우선 메인함수를 보면, 처음에 40 바이트를 할당하였습니다.그럼 메모리의 구조는| buffer: 40 byte | SEP: 4 byte | RET: 4 byte |이므로 총 44바이트의 쓸모없는 값을 넣은 후 4 바이트를 쉘코드를 가진 환경변수의 주소로 덮어주면 될 것 같습니다. level20의 setuid입니다. setreuid 쉘 코드 : \x31\xc0\x31\xdb\x31\xc9\x66\xbb\x1c\x0c\x66\xb9\x1c\x0c\xb0\x46\xcd\x80 25byte 쉘 코드: \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\..
힌트 파일을 열어 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풀이' 태그의 글 목록