Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Docker
- vtable
- level trigger
- packet filter
- LOB
- 풀이
- cbpf
- Compiler
- epoll
- wnourefresh
- wrefresh
- .nret core 배포
- DOCKER-USER
- C언어
- packet flow
- NAPT
- 어셈블리어
- .net core 7
- doupdate
- ioctl
- REDIS
- 취약점
- architecture
- iptables
- epoll_wait
- rfc5508
- mvwin
- edge trigger
- ncurses
- BOF
Archives
- Today
- Total
Tuuna Computer Science
[debugger] 32bit binary disassembler 개발일지 본문
몇 몇의 모르는 명령어와 two byte, three byte opcode를 빼곤 대체적으로 완성이 되어 지금까지의 일지를 적으려 한다.
=========================================================================
이제 쓰는 일지 그러니 1월1일 부터 시작하려한다.
1월1일
지금까지 생각해온 디버거 구상을 시작하기로 했다.
여기서 16비트 메모리체계가 아닌 32비트 메모리체계로만 설계하기로 함.
1월 2일
집 근처 스타벅스가서 코드를 작성함. (sib비트와 disp를 처리하는 함수로직 구현)
그리고 학교 파이썬 강좌에서 사요할 피피티 만들기
1월 3일
학교 파이썬 알바에서 약팔고옴. 집에와서 좀 쉬다가 8시부터 코딩... (피피티 ...)
이 시간엔 어제 스타벅스에서 구현한 코드 유지보수와 에러 수정
1월 4일
어제 에러수정하다가 빡쳐서 좀 쉬다가 4일이 되었다.
어제 에러의 원인은 다중스위치를 사용했는데 모르고 첫 스위치를 사용하지 않는데 실수로 넣은 거였다. 암튼 수정
테스트 결과 all al, bl은 잘 나왔다... 다른거 테스트하기 조금 쫄림.
한줄은 잘 작동된다.. 그런데 2줄 이상부터는 블로킹 상태에 빠진다.
문제 add al, [ebx+0xff]가 안됨. 0xf는 되는데 그리고 이를 16진수로 교체하자
그리고 빼기의 경우 값을 맞지만 +로 나오는 것을 계산하자 예를 들어 disp이면 char 임시 변수두고 캐스팅
disp32의 경우 만들어진 문자열을 atoi한 다음 int형으로 캐스팅하자 그리고 이 값이 -이면 -붙일 수 있도록
1월 5일
strtol의 함수 발견!(문자열을 16진수로 포맷), 코드의 결함을 찾았다. 숫자 사이에 00이 있으면 0으로 출력한다는점. %02x로 해결함 ㅅㅅ
블로킹 문제도 해결했다. (index값을 ++ 안해서 생긴 문제)
부분적인 성공을 보였다. 앞에 segment overriding을 추가하였으며 이제 남은 rep prefix를 추가하면 된다. (이건 나중에 관련 명령어 작업할때 사용하자)
그리고 00~03까지의 함수를 추가햐였음.
자고 일어나서 or연산자와 즉시값에 대한 함수를 추가시킴. 등등 여러가지 연산자 추가와 현 어셈블리가 몇번째 줄인지도 표시함(다시 추가해야함)
추후 계획읜 80번대에서 reg값으로 분류하는 명령어가 있는데 이를 구현하는것
그리고 cmp와 같인 핵심 명령어들 사이에선 빨간 표시할것.
bound함수는 뭘까
나중에 각 구간마다 구별할 수 있도록하자.
또 하나의 문제점 jump구간관 call 명령어 옆에 나와있는 숫자를 해석해야 하는데
1월 6일
ppt만들다가 갑자기 순열이 생각안나서 찾아보다가. 킹 오프 파이썬 역시 모듈화 되어있네.
근데 어떻게 짜느건지 감이 안잡힌다. 재귀에서 막히네... (나중에 따로 다시 봐야겠다.)
점프나 call옆에 숫자는 내 명령어줄이 끝난 다음 줄부터 1로 친거 같다. +1해서 특정 값이 나오면 거기서 부터 시작인거 같다.
그리고 옆에 숫자를 더해 나온 메모리주소를 출력하게 해야할듯.
그리고 rel8, rel16, rel32에 따라 읽는 양을 함수로 조절하자.
1월 7일
call 명령어 뒤에 나온 숫자는
이걸로 해석해야 한다.
(여기서 그냥)
int 변수에 넣고 overflow일으키면 될듯 .
x100000000 - 0xffffff7d계산해서 나온 값을 x라 하면
기존 어드레스 (call) + call 바이트 크기 - x하면 나온다.
jump관련 명령어는 +2를 하자.
일단 가장 중요한건 주소를 표기하는 방식인데..
점프 명령어는
893 signed char rel = buffer[*j] ;
894 unsigned short result = *j + rel + 1 ;
(jmp 할때 그 주소 값이 실봄의 네임이랑 일치하는지도 검사해야겠다.)
이 방식대로 하자.
1월 8일
즉시값이 있는 함수에선 BYte ptr이랑 DWORD ptr이렇게 붙이자. 앞에 (수정 : 메모리에 값을 넣을 때 붙이는 같다)
mov 0x8c부분을 새롭게 추가했다. 보니깐 세그먼트를 오버라이드랑 별개로 쓰더라
새로운 사실 x86 시스템에선 NOP코드가 xchg eax, eax 또는 ax, ax였다는 것... 그래서 gdb깔떄 뒤에 그렇게 뜬거구나
오늘 mov랑 다 끝내야 겠다 jump도
1월 11일
뭐 계속 만들고 있지만 만들면서 느낀점은 자주쓰는 명령어는 따로 기계어가 존재하는 것을 보아
속도면에서 많은 노력을 기울인듯 하다.
나중에 동적할당 등등 모든 버퍼를 50으로 맞추자. 대비를 위해..
그리고 rep접두어를 붙이는 함수를 따로 구현했다. 문자 사이에 넣는게 귀찮아서;;
rm_ imm8이면 앞에 byte를 붙이고.
rm_imm16_32임ㄴ 앞에 dword를 붙이자.
실수한게 있는거 같다.
jmp와 call의 경우 이동할 위치가 현재 위치를 기준으로 뒤에 있을 경우 +지만 앞에 있으면 -다.
그래서 만약 rel8의 경우 char변수에 넣어서 음수를 판단해야 할듯 하다.
음수가 나오면
다 했다.
이제 심볼 네임 출력만 하면 되는데.
일단 앞에 출력할 때마다. 심볼의 주소값과 일치한다면 <address> <symbol>: 이렇게 출력하고
call이나, jmp관련 명령일땐 call 2d <symbol> 이렇게 한다.
그 주소값과 심볼의 주소값과 동일한지 확인이 필요하다.
elf_parser.h에서
symbol[i].st_name과 symbol[i].st_value를 반환해서 사용하자. 그 심볼의 size도 반환해야 하네
1월 12일
sym과 인터페이스 작업을 마무리해야한다.
elf_parser파일을 가공을 어떻게 해야할까...
인터페이스까지 완성이 되었다.
남은건 GUI를 구현하는건데 ㅎ...
그리고 시간이 남으면 symbol중에성 동적링킹에 있는 심볼도 출력해야 한다.
그리고 중요한 문구같은거에는 색갈을 입히자. (reg값으로 구분이 필요로한거는 아직 안했는데 나중에 차차 해결하자.)
1월 13일
메모리덤프 기능은 데이터영역등등 의 주소를 받아와서 dumpcode 모듈에 집어넣자
그리고 메모리 할당한거 해제도 좀 하고
그리고 two byte opcode도 좀 추가하고
movzx를 구현하는데 index가 중복적으로 증가하는 일이 발생하여 기존의 index를 저장하고 넘기는 식으로 변경
그리고 mov eax, gs:0x14를 해석하지 못하는 일이 발생했다.
moffset이 gs:offsetㅡ로 해석해야 할듯
모든 구간에 dword ptr와 byte ptr, word ptr을 추가했다.
=========================================================================
여기까지가 지금까지 작성한 일지인데 계속 개발을 해나감으로써 디버거가 완성할때까지 지속적으로 일지를 작성할듯 함.
https://github.com/txuna/Debugger
위의 깃헙에 접속하여 디스어셈블러를 다운받아 사용할 수 있다.
플랫폼은 리눅스이며 대상 바이너리는 32bit 바이너리다.
사용법은 ./disassembler <file> 치고 디스어셈 원하는 symbol name을 입력해주면 된다.
'Debugger' 카테고리의 다른 글
[디버거] 디버거 제작을 위한 ToDo it List (0) | 2019.02.21 |
---|---|
[ 32bit ELF Debugger ] 디스어셈블리러(disassembler), 디버거(debugger) 제작 일지2 (0) | 2019.02.20 |
ModR/M 바이트에서 Mod+R/M과 Reg와의 목적지(순서) 구분 & SIB 바이트 작성법 (0) | 2018.12.15 |
인텔 기계어 정리 (1) | 2018.12.13 |
[디버거] ELF Parser 개발일지 .symbol내의 심볼 출력 (0) | 2018.12.04 |
Comments