목록분류 전체보기 (420)
외로운 Nova의 작업실
안녕하세요. 이번 시간에는 점프 명령어에대해서 정리해보도록 하겠습니다. - 특정 플래그 값에 따르는 점프 니모닉 설명 플래그/레지스터 JZ Jump if zero ZF = 1 JNZ Jump if not not zero ZF = 0 JC Jump if carry CF = 1 JNC Jump if not carry CF = 0 JO Jump if overflow OF = 1 JNO Jump if not overflow OF = 0 JS Jump if signed SF = 1 JNS Jump if not signed SF = 0 JP Jump if parity PF = 1 JNP Jump if not parity PF = 0 - 동등 비교에 따르는 점프 니모닉 설명 JE Jump if equal(leftOP..
안녕하세요. 해킹 첫번째 도전으로 제가 어셈블리어로 만든 ArraySum 프로그램에 항상 마지막 값이 +3이 되는 악성 코드를 심어 결과값이 바뀌게 도전을 하려고합니다. ArraySum 프로그램의 코드는 아래와 같습니다. ;this program prompts the user for three integers ;store them it an array, calculates the su of the array, and display the sum ;-----------------INCLUDE------------------------- ; include c:\assembly\irvine32.inc includelib c:\assembly\irvine32.lib includelib c:\assembly\ke..
안녕하세요, 이번 시간에는 프로시저를 사용하여 프로그램을 설계해보겠습니다. - 프로시저의 문서화 프로시저를 만들때 문서화를 하는 것은 개발해야할 좋은 습관입니다. 다음은 프로시저의 시작 부분에 넣을 수 있는 정보입니다. 1. 프로시저가 수행하는 모든 작업에대한 설명 2. Receive : 입력 매개변수에 대한 설명 3. Return : 프로시저가 반환하는 값에대한 설명 4. Requires : 요구 사항에대한 목록 위를 참고하여 세개의 32비트 정수의 합을 계산하는 SumOf라는 이름의 프로시저를 설명해보겠습니다. 3개의 정수는 호출되기전에 eax, ebx, ecx에 저장되어 있어야합니다. ;---------------------------------------------------------------..
안녕하세요, 이번 시간에는 Runtime Stack(실행시간 스택)을 사용하는 방법에대해서 알아보겠습니다. - Runtime Stack Runtime Stack은 스택 포인터 레지스터라고 하는 ESP 레지스터를 이용하여 CPU가 직접 관리하는 메모리 배열입니다. ESP 레지스터에는 스택에 있는 어떤 위치에 대한 32비트 오프셋을 저장합니다. ESP를 직접 조작하는 일은 거의 없으며, CALL, RET, PUSH, POP 과같은 명령어를 사용하여 간접적으로 수정됩니다. - Runtime Stack의 구조 자료구조를 배우셨다면 잘 알듯이 LIFO 구조를 가지고 있습니다. 마지막에 넣은걸 먼저 빼내야 처음에 넣었던 것을 뺄 수가 있죠. 다만, 시스템적으로보자면 Runtime Stack은 큰 숫자의 주소를 먼저..
안녕하세요. 이번 시간에는 이전 시간에 배운 라이브러리 프로시저를 사용하여 예제 프로그램을 만들어보도록 하겠습니다. 1.간단하게 글자색을 변경하고, DumpMem 으로 배열의 값을 나열하고 사용자로부터 값을 3번 입력받아 각각 그것을 int, hex, bin 형태로 출력 하는 프로그램을 짜보도록 하겠습니다. 프로시저들이 궁금하다면 이전 시간의 글을 참고하시면 이해가 편하실 겁니다. include c:\assembly\irvine32.inc includelib c:\assembly\irvine32.lib includelib c:\assembly\kernel32.lib includelib c:\assembly\user32.lib .data COUNT = 3 GreenTextOnBlack = Green + (..
안녕하세요, 이번 시간에는 irvine16과 irvine32 라이브러리에 있는 프로시저가 어떻게 사용되는지 알아보도록 하겠습니다. CloseFile CloseFile 프로시저는 이전에 생성하거나 열었던 파일을 닫습니다. 파일은 eax에 들어있는 32비트 정수 핸들로 식별됩니다. 파일이 성공적으로 닫히면 eax로 반환되는 값은 0이아닌 값입니다. 아래는 예시입니다. mov eax, filehandle call CloseFile Clrscr Clrscr 프로시저는 콘솔 윈도우를 깨끗하게 지웁니다. 이 프로시저는 일반적으로 프로그램의 시작과 끝에서 호출됩니다. 프로그램의 중간에서 호출된다면 사용자가 화면을 지우기전에 스크린에 이미있던 정보를 볼 수 있게 WaitMsg 프로시저를 호출하는 것을 추천합니다. 아래..
안녕하세요, 오늘은 JMP 와 LOOP 명령어가 무엇인지 배워보고 직접 실습해보는 시간을 가져보도록 하겠습니다. JMP 명령어 JMP destination 은 코드레이블로 표시되는 목적지로 무조건 이동시킵니다. 간단한 JMP 명령어 코드를 봐보도록 하겠습니다. top : ... ... JMP top JMP 명령어에의해 위 코드는 반복되게 됩니다. 또한 JMP는 무조건 적이여서 루프를 빠져나가는 다른 방법이 없으면 위와 같은 루프는 끝없이 계속될 것 입니다. LOOP 명령어 LOOP destination 은 ECX가 자동적으로 카운트로 사용되며 루프를 반복할때마다 ECX의 값을 감소시킵니다. 또한, 루프의 목적지는 현재 위치 카운터에서 -128~+127 바이트 내에 있어야합니다. LOOP 명령어의 실행은 ..
안녕하세요, 이번에는 어셈블리에서 간접 주소 지정 이론 및 실습을 진행해보도록 하겠습니다. 직접, 간접 주소 지정 직접 주소 지정의 경우 주소를 직접 써넣는 것입니다. 예를 들어 코드를 보시죠. include c:\assembly\irvine32.inc includelib c:\assembly\irvine32.lib includelib c:\assembly\kernel32.lib includelib c:\assembly\user32.lib .data array BYTE 10, 20, 30, 40 .code main PROC mov al, [00404000b];al = 10 mov ah, [00404001b];ah = 20 mov bl, [00404002b];bl = 30 mov bh, [00404003b..
안녕하세요, 오늘은 데이터 관련 연산자와 디렉티브 이론 및 실습을 해보겠습니다. OFFSET 연산자 OFFSET 연산자는 변수의 주소를 반환하는 연산자 입니다. 정확히 말하면 데이터 세그먼트 시작으로부터의 레이블의 바이트 단위의 거리를 반환해줍니다. 실습으로 한번 알아보겠습니다. include c:\assembly\irvine32.inc includelib c:\assembly\irvine32.lib includelib c:\assembly\kernel32.lib includelib c:\assembly\user32.lib .data bVal BYTE ? wVal WORD ? dVal DWORD ? dVal2 DWORD ? .code main PROC mov eax, OFFSET bVal mov ebx,..
안녕하세요, 오늘은 덧셈과 뺄셈 관련하여 어셈블리어를 배워볼까합니다. INC, DEC 형식 : INC reg/mem, DEC reg/mem INC는 피연산자의 값을 1증가시키는 명령어 입니다. 이에 반해, DEC는 피연산자의 값을 1 감소시키는 명령어 입니다. ADD 형식 : ADD dest, source ADD는 source의 값을 dest의 값에 더하여 dest에 저장합니다. SUB 형식 : SUB dest, source SUB은 source의 값을 dest의 값에서 뺀다음 dest에 저장합니다. NEG 형식 : NEG reg/mem NEG는 피연산자를 2의 보수로 계산하여 부호를 바꿉니다. 산술 연산의 결과는 상태 플래그를 변화시킵니다. 이제 산술연산의 결과로 어떻게 상태 플래그가 변하는지 알아봅시..