Search

[pwnable.kr] memcpy

tag
write-up
Last edited time
2022/01/07 12:50
Category
pwnable.kr
Visibility
Public

1. 문제

the compiled binary of "memcpy.c" source code (with real flag) will be executed under memcpy_pwn privilege if you connect to port 9022. execute the binary by connecting to daemon(nc 0 9022).8
C
복사
memcpy.c 소스코드가 주어진다. nc로 9022포트에 붙으면, memcpy_pwn 권한으로 바이너리가 실행된다고 한다.
memcpy를 커스텀으로 구현한것 같다. slow/fast 버전이 있는데 이는 소스코드를 확인해야한다. 실험이 성공적으로 끝나면 플래그를 알려준다.
소스코드에는 실험을 총 10번 진행하는데, 이상하게 5번 수행되고 종료된다. 뭔가 문제가 있어 보인다.

2. 접근방법

해당 소스코드를 로컬로 가져와서 디버깅을 해보면
movntps 어셈 부분에서 터진다.
movntps 명령어는 두 번째 오퍼랜드로 입력받은 XMM 레지스터에 있는 float형 데이터 4개를 캐시를 통하지 않고 첫 번째 오퍼랜드로 입력받은 메모리 주소로 복사한다. 여기서 DEST의 주소가 128bit 즉, 16바이트로 정렬되지 않으면 에러가 발생한다.
xmm 레지스터는 소수점 연산이나 최적화를 하기 위해서 사용된다. 한번에 16바이트의 데이터를 이동시킬수 있기때문에 성능을 향상시킬수 있다. 여하튼, 이 문제의 키포인트는 edx의 주소가 16바이트로 정렬되어 있지 않기 때문에 발생하는 문제이다.

3. 풀이

메인에서 입력한 사이즈에 따라서 동적할당이 일어나는데, 이때 할당받는 주소들을 16바이트로 정렬시키면 될것이다.
bin에서의 재할당 시킬 청크가 없기 때문에, top 청크를 잘라서 할당해준다. 할당받는 주소들을 16바이트 배수가 되게끔 사이즈를 입력하면 된다.
첨에 8 , 16, 32, 64 , 128 .. 이렇게 줬는데 128 malloc에서 터졌다. 따라서 64 malloc 할때 +8 주고 이런식으로 터지는 부분 이전의 malloc 에서 +8로 주면 된다.

4. 몰랐던 개념

movntps
movdqa
=⇒ 16바이트 정렬