전형적인 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 |