일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- NAPT
- architecture
- epoll
- wrefresh
- level trigger
- mvwin
- iptables
- BOF
- 풀이
- .nret core 배포
- packet flow
- cbpf
- ioctl
- C언어
- .net core 7
- Compiler
- epoll_wait
- REDIS
- ncurses
- wnourefresh
- Docker
- LOB
- DOCKER-USER
- 취약점
- packet filter
- edge trigger
- 어셈블리어
- doupdate
- rfc5508
- vtable
- Today
- Total
목록system hacking (10)
Tuuna Computer Science
gdb 꿀팁 Segmentation fault가 뜰때까지 실행하기 file set pagination off set breakpoint pending on break exit commands run end run 스크립트 파일 작성하고 gdb -x 하면 segmentation fault가 난곳에서 멈춤 source code보면서 glibc 디버깅 하기 sudo apt install libc6-dbg sudo apt isntall glibc-source cd /usr/src/glibc tar glibc-2.23.tar.xz #glibc version will be change depend on your system environment #now you can debugging with libc source..
추가) 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 에 존재하므로 ..
malloc & heap 찍어누르기 2탄과 3탄은 트레이닝 바이너리 문제를 풀다가 unsortedbin을 통해 library leak과 fastbin을 통해 특정 메모리 할당에 대해 배운것을 정리할겸 작성 malloc을 통해 stack 공간 할당하기 기본적인 이론은 fastbin에 들어있는 chunk들은 병합을 하지 않으며 LIFO방식의 단일 연결리스트를 구성하고 있다. 그리고 재할당시 최상위 chunk를 재할당하며 다음 재할당시 반환된 chunk의 fd값에 있는 chunk를 재할당하게 된다. 그럼 fd값을 조작할 수 있다면 조작된 fd값에 allocate가 된다. 일단 a와 b를 malloc을 통해 할당한다. 0은 8바이트로 취급된다. b와 a 순서대로 free한다. a와 b는 8바이트이므로 fastb..
protostar heap3문제의 double free bug를 구글링 3일 동안 해가면서 공부한것을 정리하려함. 일단 설명할 malloc()은 x86기준으로 설명할 것임. 우리가 알고 있는 malloc함수는 Heap영역에 우리가 원하는 크기만큼 메모리를 할당하는 것인걸로 알고 있고. 해제 할때는 해당 메모리의 포인터값을 free()함수의 인자로 넣으면 된다는 것을 알고 있다. 그런데 여기서 이상한 점이 있다. free()라는 함수에 단지 Heap영역에 할당받은 포인터값을 넣었는데 어떻게 메모리에서 해제되었을까. 그 이유는 malloc의 chunk(메모리 할당 부분)에서 찾아볼 수 있다. struct malloc_chunk { INTERNAL_SIZE_T prev_size; /* Size of previ..
추가 : 코드 짜면서 인라인 어셈블리에 새로운 것을 많이 알았음 예를 들어 output, input이라던가 등등 첨엔 변수의 값을 어떻게 이동시킬 지 몰랐는데 input쪽에 따로 설정하는 구간을 보고 개놀램. 학교 과제를 훔쳐보는 도중에 bof 취약점을 어떻게 방어할 것인가를 생각하는 거였는데 이때 bof를 못하게 Canary값을 넣어 방지한느 것은 이미 알고 있었지만 실제로 구현은 못해봤다. 그래서 오늘 한번 해보기로 함. 일단 아래는 문제의 소스이다. 32바이트 선언하고 뭐도 없고 BOF그냥 일어난다. 근데 저 코드에 몇 몇의 인라인 어셈블리 코드를 삽입하여(Canary) BOF를 방지해보려 한다. #include #include #include #include //check함수는 카나리값을 확인하여..
전에는 재접속 안되는 1대1 채팅프로그램이였는데 이젠 놉 책의 예제를 좀 수정해서 방분리 개념이 잡힌 채팅프로그램을 만들어봤습니다. 1차원배열을 이용했었다면 2차원 배열로 여러개의 방개념을 잡고 관리했습니다. 아 전 쓰레드를 이용해서 환경을 조성했는데 나중엔 epoll이나 IOCP로 구성해보고싶네요 ㅋㅋ OS : linux 실행법 :: server program인 ./room_chat_server 해주세요 그리고 client program인 ./room_chat_clnt 해주시면 됩니다. 그리고 원하는시는 채팅방에 참여하면 됩니다. 다음엔 전송 시간하고, 현원등 깔끔한 인터페이스를 제공해보고 싶네용 ㅋ.ㅋ (당구장표시) 코드를 마음대로 뜯어주세요
[윈도우 메모리의 구조] 프로세스의 가상주소 공간 -> 모든 프로세스는 자신만의 주소 공간을 가진다. 32bit 프로세스는 32bit의 포인터를 이용하여 0x00000000 ~ 0xFFFFFFFF까지 표현한다. 각 각의 분할 공간 : 파티션 파티션 x86 32비트 윈도우 x86 32비트 윈도우(유저모드 3G) NULL 포인터 할당 0x00000000~0x0000FFFF 0x00000000~0x0000FFFF 유저 모드 0x00010000~0x7FFEFFFF 0x00010000~0xBFFEFFFF 64KB 접근 금지 0x7FFF0000~0x7FFFFFFF 0xBFFF0000~0xBFFFFFFF 커널 모드 0x80000000~0xFFFFFFFF 0xC0000000~0xFFFFFFFF (커널코드, 디바이스 드..
가상메모리란? ->프로그램을 실행할 때 실제 메모리 주소를 사용하지 않고 가상의 메모리 주소를 사용한다. 또한, 가상메모리는 메모리 관리 장치로 인해 물리 주소로 바뀌게 된다. (32bit 운영체제 환경가정) 즉 사용자의 컴퓨터 장착된 실제메모리 주소가 3G라면 가상메모리는 32bit운영체제가 가질 수 있는 최대 메모리 4G에 대한 가상메모리가 생성되고 이는 물리메모리 주소로 변환된다. 또한 덧 붙이자면 디스크 공간도 메모리공간으로써 사용할 수 있다. 메모리구조 : 코드영역, 초기화된 데이터 영역, 비초기화된 데이터 영역, Heap영역, 공유 라이브러리 영역, 스택영역//커널영역 0x00000000 커널 : 0xC0000000~ 0xFFFFFFFF -> 사용자가 프로그램을 실행하여 되는 프로세서는 자신만..