전형적인 add delete 등의 옵션이 있는 heap 문제이다


여기에는

 v3 + *(_DWORD *)*(&ptr + index) >= (unsigned int)((char *)*(&ptr + index) - 4) 

같이 생긴

이상한 바운더리 체크가 있는데 일단 한번 들여다 보자


구조체를 분석하면 다음과 같다


-------------------------------

ptr   ->1     v(malloc(80))   ->     a(desc size)   -> desc


name(124)


-> 2    v(malloc(80)    ->     a(desc size) -> desc


name(124)



------------------------------


desc size를 처음에 한번

입력할때 한번 받게 되는데

desc size boundary check를 


 if ( v3 + *(_DWORD *)*(&ptr + index) >= (unsigned int)((char *)*(&ptr + index) - 4) )

 {

   puts("my l33t defenses cannot be fooled, cya!");

   exit(1);

 }

 printf("text: ");

 fgets_80486BB(*(char **)*(&ptr + index), v3 + 1);// input text


이런식으로 하게 되는 것이다


이는 v의 포인터가 a의 포인터보다 높은 주소에 있기만 하면 통과 될 수 있다.

이 조건문만 통과되면 처음에 설정했단 desc size보다 더 많은 값을 desc에 fgets로 쓸 수 있게 된느 것이다. 

즉 1을 free한 다음

1이 free된자리에 새로운 malloc으로 desc를 써주면 2번정보를 덮어 쓸 수 있다

2를 free_got로 덮어써서 free의 libc주소를 릭한후

system 주소를 계산해서 update를 이용 free를 system으로 got overwrite한다

desc와 user 가 모두 /bin/sh인 새로운 청크를 만들어

free를 하면 쉘이 실행된다.




'CTF' 카테고리의 다른 글

[christmas ctf]house of daehee  (0) 2017.01.17
[9447-ctf-2015] search 230pt  (0) 2017.01.08
[SECCON 2016] pppppoxy  (0) 2016.12.29
[SECCON2016]jmper writeup 300p  (0) 2016.12.13
[SECCON2016]vigenere암호 100p  (0) 2016.12.12

+ Recent posts