일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- BOF
- ioctl
- level trigger
- ncurses
- .nret core 배포
- 어셈블리어
- doupdate
- mvwin
- iptables
- REDIS
- epoll_wait
- .net core 7
- cbpf
- rfc5508
- C언어
- 풀이
- wrefresh
- vtable
- LOB
- epoll
- Docker
- wnourefresh
- edge trigger
- architecture
- Compiler
- packet filter
- packet flow
- DOCKER-USER
- 취약점
- Today
- Total
목록Computer Science (129)
Tuuna Computer Science
일단 ToDo 리스트에서 한것은 X표시하고 안한것은 [] 표시로 빈칸을 뒀는데 한것보다 안한게 많네... ㅎ 계속 열심히 달려야지. [x]ELF 중요한 메타데이터 파싱하기 [x]ELF 각 각의 심볼 인덱스 입력시 헥스 덤프 출력 [x]인텔 기계어 형식 정리하기 []PLT, GOT 값 찾아가기 (plt에 있는 라이브러리 함수 이름 체킹) [x]static의 경우 찾기가 조금 어렵네 인덱스 번호가 아니라 함수의 이름만 적어서 찾을 수 있도록 해야겠다. (아니면 FUNC만 출력할 수 있도록할까)[x]헥스 덤프를 통해 나온 값 기계어 형식에 맞춰서 디스어셈하기 []어셈블리로 정의한 함수는 왜 readelf -s binnary 했을 때 보이지 않는가 (size가) []data flow analysis[]symbo..
디스어셈블러랑, 디버거를 이미 다 제작이 완료되었지만 귀차니즘으로 아직 안올렸는데 이제 스타벅스온김에 올리려합니다. ================================================================ ptrace를 활용한 나만의 debugger가 완성되었습니다.ㅎㅎ ! 아직까지 수정하여할 부분이 많지만 초기 완성단계본 올려봅니다. platform:Linux & Unix 계열대상바이너리 : 32bit elf (no-pie)파일 사용법./debugger 명령어 도움말help 치시면 됩니다. [인터페이스] 현재 오류는 메모리덤프와, 레지스터 세팅, 메모리 수정 부분에서 오류가 발생했는데 조만간 고칠예정입니다. (strtok 문제인듯...)(해결) 또한 step over를 아직 ..
몇 몇의 모르는 명령어와 two byte, three byte opcode를 빼곤 대체적으로 완성이 되어 지금까지의 일지를 적으려 한다. ========================================================================= 이제 쓰는 일지 그러니 1월1일 부터 시작하려한다. 1월1일 지금까지 생각해온 디버거 구상을 시작하기로 했다. 여기서 16비트 메모리체계가 아닌 32비트 메모리체계로만 설계하기로 함. 1월 2일 집 근처 스타벅스가서 코드를 작성함. (sib비트와 disp를 처리하는 함수로직 구현) 그리고 학교 파이썬 강좌에서 사요할 피피티 만들기 1월 3일 학교 파이썬 알바에서 약팔고옴. 집에와서 좀 쉬다가 8시부터 코딩... (피피티 ...) 이 시간엔..
개꿀팁인데 Opcode에서 오퍼랜드와 오퍼랜드 사이의 목적지를 구별 짓는 것이 상당히 어려웠다. 어떤 블로그에선 Mod 비트부분에서 11이면 목적지가 레지스터라는데 테스트 결과 조금 개소리였다. (아닐수도) 구글링 결과 Mod부분이 11이면 R/M이 Register임을 알린다. 추가 적으로 Mod부분이 00이라면 뒤엔 Displacement가 따른다. 그래서 고민하다가 구글링 해보았는데 Opcode안에 d라는 비트와 s라는 비트가 숨겨져 있었다! d비트는 전체 1번째 비트에 s비트는 전체 0번째 비트에... ┌──────────────────────────┐ │ │ │ │ │ │ │ d │ s │ ├──────────────────────────┤ d비트는 이 Opcode에 의한 오퍼랜드가 어떤 방향으로..
일단 바이너리의 Opcode를 디스어셈블리하기 전에 일단 바이너리에 쓰여진 Instruction의 형태가 어떻게 구성되어 있는지 부터 알아야 할 것이다. 지금까지 공부한걸 정리할겸 포스팅 ~.~ 기계어의 형식 컴퓨터는 0과 1밖에 모르는 기계이다. 이 기계가 특정 Instruction을 작동시키게 하려면 당연히 0과 1로 이루어진 수로 주어야 한다. 사람의 입장에서는 이 숫자들을 직관적으로 이해하기 어려워 이 Instruction을 바탕으로 mnemonic화 시켰다. 이를 Assembly어라고 한다. 디버거를 만들기 앞서 위에서 정의한 Instruction => Assembly(mnemonic)으로 디스어셈블 해야 하는 것이 목적이다. fix 그럼 Disassemble하기 위해선 Intel의 Instru..
.symtab 섹션에서 확인할 수 있는 symbol들을 구하는데 성공했다. .symtab 섹션과 .strtab 섹션과의 위치를 뺐더니 특정값이 나오는데 그 값에 .symtab에 저장되어 있는 엔트리의 구조체의 크기를 나눈다. 그러면 엔트리(Symbol)의 개수를 구할 수 있다. 그리고 엔트리 구조체의 멤버 변수중에 st_name을 통해 .strtab의 섹션에서의 인덱스값으로 사용하여 symbol들의 이름값을 구할 수 있었다. symbol 구조체중에 st_info의 값이 Type과 Bind의 값이 합쳐진건데 이 st_info값을 ">> 4"해서 Bind값을 구하고, " & 0xf" 연산해서 type값을 구할 수있다. 사용자가 값을 받을 때에는 symbol의 이름을 적는게 아니라 st_name, 인덱스값을 ..
elf header와 elf header의 내용을 바탕으로 섹션 헤더를 출력하는데 성공했다. 이젠 이 섹션 헤더를 바탕으로 .symtab 섹션으로 가서 심볼들을 체크해봐야 겠다. int check_elf(int file) { ssize_t check; char value[16]; int i; int magic=1; lseek(file, 0, SEEK_SET); for(i=0;i 파일이 object파일임을 나타냄. 기계 독립적인 데이터 제공 Elf32_Half e_type; //=> Object 파일의 타입을 표시 Elf_Half e_machine; //=> 아키텍쳐 정보를 표시 (32인지 64인지) Elf_Word e_version; //=> Object 파일의 버전 정보 Elf_Addr e_entry;..
[ 메모리 1MB 어떻게 접근하죠?] 8086에서는 1MB까지의 메모리를 사용가능한데 메모리지정 방식은 0x0000:0000 ~ 0xFFFF:FFFF 이다. 즉, 0xFFFF:FFFF를 물리주소형식으로 변환하면 0x10FFEF다. 이는 1MB를 초과한다. 그럼 이 초과되는 것은 어디에 기록되는 걸까 이 초과되는 것은 메모리의 0x0000:0000에서 부터 다시 기록된다. 즉, 이전의 데이터가 겹쳐진다는 것이다! 그래서 펜티엄4의 어드레스 라인이 32개 있는데 그중 어드레스 라인 20번, A20번을 키보드 컨트롤러와 AND연산을 진행한다. 그래서 키보드 컨트롤러의 특정 핀을 1로 세트해야만 A20번이 1로 세트되었을 때 그 값이 1로 RAM에게 전달 될 수 있다. 이 A20와 키보드 컨트롤러를 킴으로써 1..
플레이 스토어 검색도중에 재밋는 게임을 발견했고 풀어볼려다가 파이썬이나 C로 이 게임을 풀어보려한다. 일단 게임의 전반적인 규칙은 NxN의 배열판이 있고 행과 열에 적힌 숫자는 각 행과 열에 둘 수 있는 텐트의 값이다. 그리고 나무가 존재하는데 텐트는 무조건 나무기준으로 바로 옆에 위치해야 한다. 그리고 남는 공간에는 잔디를 두어야 한다. 이 게임의 공략 소스는 나중에 짜도록하고 어떠한 식으로 만들어야 할지 글로만 끄적여 볼것이다. 나무옆에 텐트 알고리즘 나무 : 3 땅 : 0 잔디 : 1 텐트 : 2 일단 먼저 행과 열의 번호에 0이 있다면 그 자리는 잔디로 다 밀어버린다. 단 나무자리는 보호 그러면 배열판은 0과 1 그리고 3으로 이루어져 있다. 이 배열판을 복사한다. tmp배열로 나무의 위치를 잡고..
메모리의 주소를 표현하기 위해 우리는 3가지의 단어를 사용한다. 논리주소, 선형주소(가상주소), 물리주소 이들 중에서 실제로 CPU가 인식할 수 있는 주소는 "물리주소"이다. 그럼 이 3가지의 주소가 무슨 의미인지 살펴보자. 논리주소 :: 프로그래머의 관점에서 본 주소. 주로 오프셋의 의미가 강하다. 선형주소 :: 논리주소를 GDT와 LDT를 통해 나온 주소를 의미한다. 물리주소 :: 선형주소를 페이징을 통해 나온 주소를 의미한다. 자 기본적으로 (논리주소 => 선형주소 => 물리주소) 변환하게 된다. 이 어셈코드를 보자 lea esi, [msgPMode] "ESI레지스터에 msgPMode의 주소를 복사해라"는 의미를 지닌다. 그럼 ESI레지스터에는 msgPMode의 주소가 복사되는데 이 내용을 기계어의..