일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 어셈블리어
- epoll
- doupdate
- level trigger
- rfc5508
- REDIS
- LOB
- packet flow
- BOF
- cbpf
- wrefresh
- architecture
- DOCKER-USER
- NAPT
- epoll_wait
- Docker
- ncurses
- .net core 7
- wnourefresh
- 풀이
- mvwin
- Compiler
- edge trigger
- ioctl
- vtable
- 취약점
- packet filter
- .nret core 배포
- C언어
- iptables
- Today
- Total
Tuuna Computer Science

추가) JMPREL 이라고 .rel.plt부분의 구조체는각 각 0x24의크기인데이는 reloc_offset으로 _dl_fixup()함수내부에서 찾아낸다. 그리고 rel.plt 구조체 내에는 3개의 멤버가 있는데 각 각, reloc_offset에 맞게 정의된 함수의 GOT주소값 r_info라고 하위 1바이트는 심볼의 타입을 나타내고 나머지는 값은 dynsym내에서 인덱스값을 지정하는거 같다. 즉, 처음 .rel.plt의 주소값이 A라면 특정 함수의 relocation 구조체의 주소값은 A+reloc_offset*24로 설명되며 특정 함수의 .dynsym 위치는 .dynsym의 주소값 + relocation.r_info(나머지 부분)*24하면 구해진다. 그럼 이 특정 함수의 .dynstr의 값은 어케구하냐 ..

heap address leak a, b, c 3개를 malloc 요청하고 c와 b 순서대로 free시키면 fastbin이므로 LIFO원칙에 따라 b의 fd에는 C의 heap주소값을 가리키게 된다. 이때 a를 overflow시킬 수 있다면 b에 있는 C의 heap주소를 leak해낼 수 있다. 이때 a chunk를 특정 문자로 b의 fd까지 넣으면 printf로 인해서 널문자까지 출력되는데 이때 C의 heap주소값도 포함되게 된다.

unsorted bin을 통해서 library base address를 leak할 수 있다는 정보를 얻었고 실제로 재현. ptr1와 ptr2라는 128byte의 malloc을 요청한다. 이는 72byte인 fastbin보다 큰 수이기 때문에 free시 unsortedbin에 들어가게되며 병합되어 small bin으로 가게된다. 이때 ptr1을 처음 free했을 때 unsorted bin에 들어가게 되는데 단일 chunk로서 fd와 bk를 연결할 곳이 없어 fd와 bk모두 main_arena+88의 주소를 가리키게 된다. 그럼 이때 free된 청크를 다시할당하면 UAF취약점이 발생하게 되어 main_arena+88의 주소값을 leak할 수 있게 된다. main_arena는 libc.so.6 에 존재하므로 ..