전체 글 88

인자가 다수인 함수의 활용

개요어셈블리에서 인자가 다수인 함수 사용 시 기본 구문은 다음과 같다.push [n번째 인자]push [n-1번째 인자]...push [첫번째 인자]call [함수] 이를 활용하여 다음 C 프로그램을 어셈블리로 작성해 볼 것이다.printf("hello, %d\n", 12);환경활용 프로그램: x32dbg.data 영역: 0x403030~printf 주소: 0x402614예시1정수 인자값을 바로 PUSH하는 예시다. 먼저 'hello %d\n'을 메모리에 로딩한다. 리틀 엔디언을 고려하여 역순으로 입력한다.mov dword ptr ds:[0x403030], 0x6c6c6568 // llehmov dword ptr ds:[0x403034], 0x25202c6f // o ,%mov dwor..

인자가 다수인 함수

개요어셈블리에서 인자가 다수인 함수 사용 시 기본 구문은 다음과 같다.push [n번째 인자]push [n-1번째 인자]...push [첫번째 인자]call [함수] 이를 활용하여 다음 C 프로그램을 어셈블리로 작성해 볼 것이다.printf("hello, %s\n", "assembly"); 활용 프로그램: x32dbg상세1. 메모리에 필요한 문자열을 적재한다. 어셈블리에서는 쌍따옴표가 필요없다. 2. 점프 테이블에서 printf 함수의 주소를 복사한다. 3. 코드를 작성한다.push 0x403040 // assemblypush 0x403030 // hello %s\ncall 0x402614 // printf 4. 실행 결과를 확인한다.주의 사항메모리 주소에서 Edit을 통해서 \n을 입력..

어셈블리로 문자열 출력하기

개요어셈블리의 함수 실행 기본 구문은 다음과 같다.push [인자값]call [함수] 이를 활용하여 hello world 문자열을 출력해 본다. 활용 프로그램: x32dbg1. 메모리에 문자열 로딩1-1. 'Memory map > .data > Follow in dump'를 클릭한다. 1-2. 기본 화면에 .data 영역이 표시된 것을 확인한다. 1-3. 빈 데이터 영역을 클릭한 후 Ctrl+e를 눌러 Edit 창을 연다. 1-4. UTF-8 칸에 원하는 문자열을 입력한다. 1-5. 메모리에 문자열이 올라간 것을 확인한다.2. printf 함수 찾기2-1. 스크롤을 내려서 함수 call을 찾는다. 어떤 함수인지는 상관 없다. 이를 더블클릭한다. 2-2. 점프 테이블 화면으로 넘어와지면, 메모리에 적재된 ..

어셈블리의 PUSH 명령어

개요PUSH와 POP을 통해 스택에 값을 입력한다. 요약PUSH 대상Syntax결과32bit 레지스터push eaxesp+=4*esp=eax16bit 레지스터push axesp+=2*esp=ax숫자push 0x12esp+=4*esp=0x12메모리 주소push 0x403030esp+=4*esp=0x403030예시32bit 레지스터-코드mov eax, 0xaamov ebx, 0xbbmov ecx, 0xccpush eaxpush ebxpush ecx -실행결과16bit 레지스터-코드mov eax, 0xaamov ebx, 0xbbmov ecx, 0xccpush axpush bxpush cx -실행결과숫자-코드push 0x12push 0x123456 -실행결과

어셈블리로 메모리 액세스 하기

개요어셈블리로 메모리 주소에 값을 입력하는 방법을 정리한다. 요약코드뜻mov dword ptr ds:[0x403030], 0x120x403030 메모리 주소에 0x12라는 값을 저장한다.mov dword ptr ds:[0x403030], eax0x403030 메모리 주소에 eax 값을 복사한다.mov eax, dword ptr ds:[0x403030]eax 레지스터에 0x403030에 저장된 값을 복사한다. 특이사항.data 영역의 메모리 주소를 활용하는 게 좋다. xdbg에서는 다음처럼 찾을 수 있다. 예제-목표https://www.udemy.com/share/108yyE3@mxl-GIR7PaQNu3XpfDwYDEyeZQSuRKnxBS_yJEd-kb5GH7DzNK_Fo4r4lOH-r3gWvw==/ 유..

어셈블리의 DIV 명령어

요약어셈블리의 DIV 명령어는 한 개의 레지스터를 인자값으로 가진다.div [reg] 레지스터의 길이에 따라서 다음과 같이 동작한다.레지스터 길이실행되는 계산몫 저장 위치나머지 저장 위치8bitax ÷ regalah16bitdx:ax ÷ regaxdx32bitedx:eax ÷ regeaxedx8bit 레지스터다음 어셈블리 코드의 동작을 살펴본다.mov eax, 0x1000100 #1mov edx, 0x10001 #2mov ebx, 0x11100 #3div bl #4 #3까지 실행한 결과는 다음과 같다. ax=0x100을 bh=0x11로 나눌 것이다. al, ah에 각각 몫과 나머지가 들어간 것을 확인할 수 있다. 파이썬을 통해 값을 검증한다.ax=0x10..

어셈블리의 MUL 명령어

요약어셈블리의 MUL 명령어는 한 개의 레지스터를 인자값으로 가진다.mul [reg] 레지스터의 길이에 따라서 다음과 같이 동작한다.레지스터 길이저장되는 위치저장되는 값8bitaxal*reg16bitdx:axax*reg32bitedx:eaxeax*reg 여기서 dx:ax는 dx와 ax의 결합을, edx:eax는 edx와 eax의 결합을 뜻한다.32bit 레지스터다음 어셈블리 코드의 동작을 살펴본다.mov eax, 0xa001 #1mov ebx, 0xb002 #2mul ebx #3 #2까지 실행한 결과는 다음과 같다. #3을 실행하면 결과값이 eax에 들어간 것을 확인할 수 있다. 또한 edx는 0으로 체워졌다. 이는 해당 값이 32bit로 표현이 가능하기 때문에다. 즉..

우분투 방화벽 ufw 운영하기

우분투와 데비안 계열 리눅스에서 사용할 수 있는 ufw 호스트 방화벽 주요 명령어를 알아본다. 방화벽을 활성화 시킨다.ufw enable 데몬을 재시작한다.ufw reload 방화벽 정책 목록을 확인한다.ufw status numbered 인바운드 트래픽을 기본 차단한다.ufw default deny incoming 아웃바운드 트래픽을 기본 허용한다.ufw default allow outgoing 443 포트로 인바운드 트래픽을 차단한다.ufw deny in 443 443 포트로 아웃바운드 트래픽을 차단한다.ufw deny out 443 방화벽 정책을 삭제한다.ufw status numbered # 번호확인ufw delete [번호] 모든 정책을 삭제한다.ufw reset

데비안에 Wireshark 설치하기

모든 작업은 root로 한다. 1. Wireshark를 다운로드 받는다.apt install -y wireshark 2. 아래 화면에서는 'Yes'를 선택하고 엔터를 누른다. 관리자 이외의 사용자에 Wireshark 권한을 줄지 묻는 것이다.잘못 선택했으면 아래 명령어로 재선택 가능하다.dpkg-reconfigure wireshark-common 3. dumpcap에 실행 권한을 부여한다.chmod +x /usr/bin/dumpcap 4. 프로그램을 사용할 유저를 wireshark 그룹에 추가한다.usermod -aG wireshark [유저명] 5. 해당 유저로 로그인 후 패킷 캡처가 가능함을 확인한다.

리눅스에서 그룹 및 유저 관리하기

개요리눅스에서 그룹과 유저를 관리하는 명령어를 기재한다.데비안 13기준이다.생성그룹을 생성한다.groupadd -g [그룹번호] [그룹명] 유저를 생성한다. 데비안에서는 -m 옵션을 추가해야 홈디렉토리가 생성된다.useradd -m -g [그룹번호] -u [유저번호] [유저명] 유저의 비밀번호를 설정한다.passwd [유저명]수정유저를 그룹에 추가한다.usermod -aG [그룹명] [유저명] 유저를 그룹에서 제외시킨다.gpasswd -d [유저명] [그룹명]삭제유저를 삭제한다. 데비안에서는 -r 옵션을 통해서 홈디렉토리를 삭제한다.userdel -r [유저명]그룹을 삭제한다.groupdel [그룹명]