소스 코드를 대강 살펴보면 먼저 src에 mmap() 함수로 0x2000만큼 할당한다.
dest에 사용자가 입력한 숫자만큼 heap에 할당하고 slow_memcpy() 와 fast_memcpy()를 호출해 메모리 복사를 한 다. 가운데 dest를 출력하는 부분은 내가 작성해 넣은 부분이다.
slow_memcpy() 함수는 1byte씩 그냥 복사하는 함수이고 fast_memcpy() 함수를 보면 처음보는 어셈들이 나온다.... 구글링을 조금 해보면 movdqa는 정렬된 주소의 16byte 값을 이동시키는 명령어이고, movntps는 xmm 레지스터의 16byte 값을 메모리에 옮기는 명령어이다.
두 명령어가 각각 4번씩 쓰였고, 주석의 '64-byte block fast copy'를 보면 64byte 단위로 메모리 복사를 진행하고 이 과정이 훨씬 빠른가보다. 실제로 실행시켜보면 시간차를 출력해주는데 훨씬 빠른 것을 알 수 있다.
그리고 위와 같이 movdqa 명령어의 피연산자는 16byte 경계에 위치해야 하므로, src와 dest의 주소값은 모두 16의 배수가 되어야 한다.
dest의 주소를 찍어보면 해당 주소가 16byte 배수가 아닌 부분이 존재한다. 그것은 그 전단계에서 16byte 경계를 맞춰주지 못해 발생한 것이므로 일일이 노가다스럽게 16byte 배수로 바꿔주어야 한다.
두 번째 부터 맞춰 주기 위해 8씩 더 많은 사이즈를 입력하면 모두 16byte 배수의 주소에 공간이 할당된다.
10번의 dest 주소가 모두 16byte 배수가 되면 flag를 출력한다.
'Wargame > Pwnable.kr' 카테고리의 다른 글
Pwnable.kr codemap-10pt (0) | 2017.06.05 |
---|---|
Pwnable.kr coin1-6pt (0) | 2017.05.14 |
Pwnable.kr input-4pt (0) | 2017.05.09 |
Pwnable.kr unlink-10pt (0) | 2017.05.08 |
Pwnable.kr uaf-8pt (0) | 2017.05.08 |