쉬고가라 memcpy의 성능에 관해 작은 실험을 도와달라고 한다.

그러면 flag를 준다고..


readme 파일이 있어서 먼저 읽어 보기로 한다.



nc 0 9022에 접속하면 컴파일된 바이너리가 memcpy_pwn권한 으로 실행된다고 한다.



experiment 5 부분에 fast_memcpy : 출력 부분에서 segmentation fault가 뜬다.

소스코드 맨 윗줄 주석에 보면 //compiled with : gcc -o memcpy memcpy.c -m32 -lm

라고 컴파일 옵션을 알려준다. 


참고)


-m32 옵션 에러가 난다면  --> apt-get install gcc-multilib



우선 fast_memcpy를 보면 len값이 64보다 작다면 slow_memcpy()가 실행된다.

experiment 4까지는 입력 값이 64를 넘지 않아 slow_memcpy()가 실행되어 오류가 나지 않았지만 

experiment 5부터는 len값이 64이상이 되기 때문에 fast_memcpy()가 진행되면서 오류가 난것으로 보인다.



gdb로 seg fault부분을 보기위해 내 로컬에서 컴파일 해보기로 한다.



gdb로 코어파일을 보면

fast_memcpy+52부분에서 문제가 있는듯 하다




movdqa

소스 피연산자 (두 번째 피연산자)의 이중 쿼드 워드를 대상 피연산자 (첫 번째 피연산자)로 이동합니다. 이 명령어는 128 비트 메모리 위치에서 XMM 레지스터를로드하고 XMM 레지스터의 내용을 128 비트 메모리 위치에 저장하거나 두 개의 XMM 레지스터간에 데이터를 이동하는 데 사용할 수 있습니다. 소스 또는 대상 피연산자가 메모리 피연산자 인 경우 피연산자는 16 바이트 경계에 정렬되어야하며 그렇지 않으면 일반 보호 예외 (#GP)가 생성됩니다.


movdqa는 정렬된 주소의 16byte 값을 이동시키는 명령어이고, movntps는 xmm 레지스터의 16byte 값을 메모리에 옮기는 명령어이다.




데이터 주소를 출력해주는 코드를 추가해서 프로그램을 다시 한번 실행 해보았다.

할당한 데이터 사이즈에 + 8byte씩 더 공간이 있다. molloc을 하면서 메모리공간에 대한 부가정보를 담는 공간이 추가로 생긴 듯 하다. +8바이트 만큼



메모리 공간이 16배수가 아닌 공간을 +8을 해줘서 16의 배수가 되도록 조정 해준다.

nc로 접속해서 값을 입력해주면 플래그가 출력된다.


 

'System Hacking > pwable.kr' 카테고리의 다른 글

19.pwnable unlink  (0) 2018.03.10
18.pwnable asm  (0) 2018.02.28
16.pwnable uaf  (0) 2018.02.26
15.pwnable cmd2  (0) 2018.02.23
14.pwnable cmd1  (0) 2018.02.23

+ Recent posts