HITCON 2015 matrix

크리에이티브 커먼즈 라이선스
Creative Commons License

올해 히트콘에 재밌는 문제가 많았어서 공부할겸 풀이를 작성해봅니다


matrix문제는 제일 배점이 낮은문제였는데

배점이 낮든말든 허접인 저한텐 너무 어려웠습니다


바이너리는 두개의 행렬을 입력받아 곱한다음 출력해주는 컨셉입니다


그런데 행렬을 위한 공간을 할당할 때 힙이 아닌 alloca를 이용해서 할당합니다

힙을 이용하는것과 스택을 이용하는것에서 취약성이 갈리진 않지만

이 프로그램에선 힙을 사용하는 부분이 없고

스택을 사용하기때문에 크리티컬한 데이터를 조작하기가 훨씬 수월합니다

루프를 돌때 abs를 사용하고, 추가 검증이 없어서

-2147483648로 matrix size를 그냥 넣고 행렬 요소들을 계속 입력하다보니 세그폴이 떠서

크래쉬를 일으키는데는 얼마 안걸렸습니다


취약점은 전형적인 유형인데

이 문제의 취약점은

메모리를 allocate할때(malloc이나 alloca등)

allocate하는 사이즈를 공격자가 컨트롤 할 수 있고

그 데이터보다 많이 넣을 수 있는데서 발생합니다



>>> v38 = -2147483648

>>> (16 * ((8 * v38 * v38 + 22) / 0x10))&0xffffffffffffffff

16L

>>> 


size of matrix를 -2147483648로 설정하면

alloca안의 식이 0x10으로 계산되고

abs(-2147483648) == 0x80000000이기 때문에

수치상으로만 봐도 오버플로우가 명확히 발생합니다


rip컨트롤은 굉장히 쉽고

pop; ret 을 해주면 bp-68에 있는 첫 어레이에서부터 ROP를 할 수 있습니다


관건은 fflush(stdout)을 어떻게 호출하냐인데


main함수 맨뒤에 fflush(stdout)을 해주고

rbp-28h을 rsp에 넣은 뒤 pop pop popo popo pop p op op op op op popop ret해주는 부분이있습니다

rbp-28h은 우리가 컨트롤 할 수 없는 메모리니

저기로 점프하기전에 rbp를 name(0x6020a0)버퍼에서 적당한 지점으로 설정해주면

fflush를 호출한뒤 name버퍼에서 control flow를 유지시킬수가 있습니다


hitcon2015_matrix.py


cd80.py


신고

'해킹공부 > 캡쳐더플래그' 카테고리의 다른 글

codegate 2017  (0) 2017.02.22
HITCON 2015 matrix  (0) 2015.10.23
WhiteHat Contest 2015 cd80  (6) 2015.10.12
LeaveRet JFF Season3 pwnable vaja  (1) 2015.07.26
Codegate2015 junior writeup  (5) 2015.03.16
pCTF 2013 pork  (3) 2014.08.18

설정

트랙백

댓글


티스토리 툴바