search-bf61fbb8fa7212c814b2607a81a84adf




fastbin_dup_attack을 이용한 문제로 fastbin_dup_attack이 잘 이해가 안되서 보게 된 문제이다


처음엔 잘 이해가 안되고 별거 아닌줄 알았는데 알고보니 대단한 기법이었다. fastbin_dup_attack..


fastbin_dup_attack에 대해서 간략하게 설명하자면

fastbin은 다른 bin과는 달리 free chunk가 double_linked_list 가 아니라 그냥 linked_list로 되어있다.


free 청크 chain을 예를 들어 (a)->(b)->(a)-> ... 이런식으로 체인을 걸어놓으면(같은 청크가 중복될 수는 없다-> 에러발생)

첫번째 malloc에서 a에 조작하길 원하는 주소를 쓰고 b와 a를 차례로malloc하면 그다음으로 malloc될 주소는 조금 전에 a에 썻던 주소가 된다

그렇게 원하는 주소에서 fastbin의 조건(*a-4(혹은 -8)에서 size조건)만 만족해주면 에러 없이 arbitrary overwrite를 수행 할 수가 있다.


이 문제는 uaf 등을 이용해 stack과 libc주소를 leak한 후 fastbin_dup_attack으로 return주소에다가 pop edi, /bin/sh주소, system 주소 를 넣는 ROP를 수행하는 문제이다.


stack주소는 처음 메뉴 선택에서 입력이 48자로 제한되어있으나 48자를 꽉채워서 입력하면 마지막에 null처리가 안된다는 취약점을 이용하여 leak할 수 있다.


libc주소 leak

첫번째 방법 ) index sentence를 할 때 size만큼 malloc되고 단어 저장용으로 0x40바이트가 추가로 malloc되는 점과 delete 할때 단어는 내용을 지우지 않고 sentence만 memset을 하는데 \x00으로 덮게 되므로 heap의 첫바이트가 null이 아니면 search범위에 포함된다는 점을 이용 word가 malloc된 공간에 \x00으로 search를 하여 word공간을 free하고 이부분에 sentence를 malloc하여 word 부분을 overwrite할 수 있다. overwrite에 got주소를 넣어주고 이 sentence를 포함된 단어를 이용해 search하면 libc를 릭할 수 있다.


두번째 방법) fastbin이 아닌 smallbin이나 다른 bin은 첫번째 공간에 libc주소를 할당한다. sentence를 free하고 search로 print하면 바로 볼 수가 있다. (고 한다)


마지막 fastbin_dup_attack

우선 fastbin free chunk list를 만들어 준다. 

차례로 (c)-(b)-(a)-(b) 순으로 free해서

b에 overwrite하고자 하는 stack주소를 쓴다음 (a)와 (b)를 잘 덮고 마지막 stack에 할당될 malloc에 원하는 값(ROP chain)을 넣어주면된다.

fastbin의 성질을 만족하면서 eip가 도착하게 될 부분에 잘 덮으면 쉘을 딸 수 있다.


아래는 exploit


'CTF' 카테고리의 다른 글

[HITCON CTF Qual 2016]house of orange  (0) 2017.01.18
[christmas ctf]house of daehee  (0) 2017.01.17
[33c3ctf]babyfengshui  (0) 2017.01.06
[SECCON 2016] pppppoxy  (0) 2016.12.29
[SECCON2016]jmper writeup 300p  (0) 2016.12.13

+ Recent posts