Poison null byte
https://github.com/umbum/pwn/blob/master/how2heap/poison_null_byte.c
malloc'ed region에 off-by-one error가 발생할 때, next chunk size의 LSB를 `` 0``으로 만들어 size를 속이는 방법.
결과적으로 d chunk 내부에 b2 chunk가 위치하게 되므로 d chunk에 접근해 b2 chunk를 변경할 수 있다.
null byte off-by-one error는 종종 발생하기 때문에 많은 경우에 사용할 수 있는 테크닉이라는 점은 장점.
b2 chunk는 heap에만 존재할 수 있기 때문에 b2 chunk가 function pointer 등 유용한 데이터를 저장하고 있을 경우나, overlap을 이용한 leak이 필요할 경우 말고는 그다지 쓸모가 없다는 것이 단점.
1.
a |
prev_size |
0x111 |
|
|
|
|
|
|
b |
prev_size |
0x211 |
|
|
|
|
|
|
0x200 [각주:1] |
|
|
c |
0x210 |
0x111 |
|
|
2. free(b) AND off-by-one overflow
a | prev_size | 0x111 |
|
| |
|
| |
| prev_size | 0x200 |
|
| |
|
| |
0x200 |
| |
c | 0x210 | 0x110 [각주:2] |
|
``c b->size``의 LSB는 ``c 0x01``이면 안된다.
``c c->prev_size`` 가 업데이트 되지 않도록, 그 이전에 ``c fake_next->prev_size``를 두어 이게 대신 업데이트 되도록 해야 하는데 ``c 0x01``이면 그냥 ``c c->prev_size``가 업데이트 돼버린다.
3. b1 = malloc(0x100) , b2 = malloc(0x80)
a | prev_size | 0x111 |
|
| |
|
| |
b1 | prev_size | 0x111 |
|
| |
b2 | prev_size | 0x91 |
| ||
0xf0 → 0x60 | ||
c | 0x210 | 0x110 |
|
4. free(b1) , free(c)
a | prev_size | 0x111 |
|
| |
|
| |
| prev_size | 0x20ef1(top) |
fd | bk | |
b2 | prev_size | 0x91 |
| ||
0xf0 → 0x60 | ||
| 0x210 | 0x110 |
|
이제 system은 b2 chunk의 존재를 잊어버린다.
4. d = malloc(0x300)
a | prev_size | 0x111 | |
|
| ||
|
| ||
| d | prev_size | 0x311 |
b2 | prev_size | 0x91 | |
| |||
0xf0 → 0x60 | |||
| 0x210 | 0x110 | |
|
d chunk에 접근해서 b2 chunk를 변경할 수 있다.
'Security > System Exploit' 카테고리의 다른 글
fastbin attack / fastbin_dup (0) | 2017.08.15 |
---|---|
The House of Spirit (0) | 2017.08.15 |
overlapping chunk (0) | 2017.08.15 |
one_gadget / libc-database (0) | 2017.08.13 |
pwntools (0) | 2017.08.13 |