일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- C언어
- DOCKER-USER
- architecture
- NAPT
- iptables
- 어셈블리어
- 취약점
- ioctl
- BOF
- wrefresh
- ncurses
- vtable
- doupdate
- rfc5508
- .net core 7
- Compiler
- .nret core 배포
- packet filter
- LOB
- packet flow
- epoll_wait
- cbpf
- epoll
- mvwin
- level trigger
- wnourefresh
- edge trigger
- 풀이
- Docker
- REDIS
- Today
- Total
Tuuna Computer Science
어셈블리어에서 TEST연산은 오퍼랜드 끼리 AND연산하여 결과값을 CMP연산과 같이 저장하진 않는다. 단지 플래그 값을 세팅하여 분기문에게 영향을 준다 ex) JE, JZ.... 같은 분기문 여기서 중요한것은 TEST EAX, EAX와 같은 명령어다. 얼핏보면 같은 레지스터끼리 AND연산하면 EAX값이 나올텐데 왜 하는걸까라는 생각을 할 수 있다. 하지만 바로 위에 쓰인 TEST명령어는 단지 EAX의 값이 0이냐 아니냐를 판단하기 위해서다 만약 EAX의 값이 0이라면 AND연산결과 당연히 0이 나올것이고, Z플래그 (ZF가 세팅될 것이다.) 밑에 JE 0040100 점프문이 있다면 ZF가 세팅되므로 0040100주소로 점프할 것이다.
1 mov ax, [Data] ; 워드의 직접 메모리 주소 지정 2 mov ebx, Data ; ebx = & Data 3 mov ax, [ebx] ; ax = *ebx 간접적인주소지정은레지스터를포인터변수들처럼사용할수있게한다. 레지스 터가포인터로사용됨을알려주기위해서대괄호([])로묶어주어야한다. AX가 워드를 보관하고 있기 때문에 3행은 EBX에 저장된 주소에서 시작되는 워 드 를 읽어 들이게 된다. 만약AX대신AL을 이용한다면 오직 한 개의 바이트만 읽어 들이게 될 것이다. C 에서의 변수들과는 달리 레지스터들은 형(type) 이 없다는 사실 을명심해야한다. EBX에무엇을 가리키냐는어떠한 명령이 사용되냐에 따라 완전히 달라진다. 심지어명령에의해서도EBX가포인터라는사실도정해진다. 만약EBX가 잘못사용되어도..
DB(data byte) 00을 나타낼때 점프기능 JMP점프 기능 JMP 401000 특정한 구간으로 점프! EIP : 실행할 곳의 주소를 담고 있는 레지스터 즉, JMP 401000은 EIP에 그 메모리주소가 들어가도록 하는거다. EIP는 범용레지스터가 아님(일반적인 용도로 ㄴㄴ) (MOV사용ㄴㄴ) JMP SHORT 401000에서 이동할 위치가 가까우면 SHORT F9는 거리 또한 jmp eax등 레지스터 점프도 가능 증가 연산자 INC [공간] 감소 연산자 DEC [공간] 메모리에 대해서는 사이즈 필요 INC WORD PTR [공간주소] 한바이트로 표현할 수 없는 부분은 long(생략)으로 나타난다. 예를들어 401000이라는 주소가 있는데 이곳에 위치하는 기계어를 읽어들이겠다. 그리고 램으로 넘어..