반응형

분류 전체보기 225

ARM Assembly

ARM CPU의 기본 구성 R0 ~ R15 총 16개의 범용 레지스터를 가지고 있다. 범용 레지스터 R13은 특수 레지스터 SP로 사용된다. SP(Stack Pointer)는 스택의 주소를 저장하는 레지스터이다. 범용 레지스터 R14는 특수 레지스터 LR로 사용된다. LR(Link Register)는 함수 호출 시 되돌아갈 함수의 주소를 저장하는 레지스터이다. 범용 레지스터 R15는 특수 레지스터 PC로 사용된다. PC(Program Counter)는 다음 실행할 프로그램의 주소를 가지고 있는 레지스터이다. 명령어들 MOV ARM에서 레지스터의 데이터 이동을 MOV 명령을 사용한다. ex) MOV R0, R1 (R1의 내용을 R0으로 복사) MOV R0, #1 (상수 1을 R0으로 복사) LDR (Loa..

리버싱/ARM 2021.02.09

ARM 크로스 컴파일러 및 실행

ARM 32Bit sudo apt-get install gcc-arm-linux-gnueabi sudo apt-get install g++-arm-linux-gnueabi ARM 64Bit sudo apt-get install gcc-aarch64-linux-gnu sudo apt-get install g++-aarch64-linux-gnu ARM 크로스 컴파일 하기 arm-linux-gnueabi-gcc -o test test.c (32Bit) aarch64-linux-gnu-gcc -o test test.c (64Bit) ARM 실행 qemu-arm -L /usr/arm-linux-gnueabi ./실행파일 qemu-aarch64 -L /usr/aarch64-linux-gnu ./실행파일 gdb-mu..

리버싱/ARM 2021.02.01

IMAGE_DOS_HEADER 구조와 DOS 스텁

PE 파일은 몇십 파이트의 MS-DOS 스텁(Stub)으로 시작한다. MS-DOS 스텁은 예전의 MS-DOS MZ 포맷으로 PE에서는 크게 의미가 없다. 덤프에서 "This program cannot be run in DOS mode."라는 식별 가능한 문자열을 볼 수 있을 뿐이다. PE 프로그램을 예전 MS-DOS나 윈도우 3.1에서 실행하면 바로 이 문자열이 출력된다. 사실 MS-DOS 스텁은 위의 문자열을 출력하기 위한 조그만한 16비트 도스용 애플리케이션에 지나지 않는다. DOS 스텁은 64바이트의 IMAGE_DOS_HEADER 구조체와 해당 스텁 코드로 이루어진다. WinNT.h에는 IMAGE_DOS_HEADER 구조체가 다음과 같이 정의되어 있다. typedef struct _IMAGE_DOS..

리버싱 2021.01.25

RVA와 섹션

RVA는 디스크 상에 파일로 존재하는 PE의 파일 오프셋과 함께 로드되어 메모리의 이미지로 존재하는 PE의 메모리 번지 사이의 간극을 절충시켜주는 중요한 개념이다. 섹션은 PE 파일 전체를 구성하는 파일/메모리 블록의 단위다. RVA(상대적 가상 주소 - Relative Virtual Address) PE 파일 내의 파일 오프셋과 RVA는 관점이 다르다! PE 구조에서 번지에 관계된 값, 즉 가상 주소 공간 상의 번지들은 전부 RVA 개념으로 표현된다. RVA는 이미지가 메모리에 로드되었을 떄, 더 정확히 표현하면 해당 프로세스의 가상 주소 공간 내에 로드되었을 때 그 시작 주소에 대한 상대적 번지를 가리키는 개념으로, 메모리에서 PE의 시작 주소에 대한 상대적인 오프셋 값으로 생각할 수 있다. 파일 상..

PE 파일의 전체 구조

PE 파일 포맷은 COFF(Common Object File Format)라는 포맷을 계승한 파일 포맷으로, COFF의 확장판이라고 보면 된다. COFF 포맷은 MS에서 사용하던 이전 버전의 여러 실행 파일뿐만 아니라 라이브러리 파일, OBJ 파일에 대한 공통 포맷을 제공한다. 이 PE 파일 포맷은 64bit 경우 PE+라고도 하지만, 기본적으로 PE 파일 포맷을 바탕으로 한다. IMAGE_XX_XXXX 형태의 명칭들은 모두 WinNT.h 헤더 파일에 정의된 구조체다. PE 파일은 처음에 MZ로 시작하는 IMAGE_DOC_HEADER 구조체로 시작해서 도스와의 호환을 위한 코드인 도스 스텁을 담고 있다. 이 스텁 다음부터 실제 PE 포맷이 시작된다. 실질적인 PE 포맷의 시작은 IMAGE_NT_HEADE..

PE 파일

MS는 EXE와 DLL이 갖는 파일 구조를 PE 파일 포맷이라고 명명했다. 이때 PE는 "Portable Executable"의 약자로, 이 포맷으로 구성된 PE 파일들은 플랫폼에 관계 없이 윈도우 운영체제가 돌아가는 시스템이면 어디서든 (Portable) 실행 가능 (Executable)하다는 의미에서 PE라는 이름을 붙였다. WinNT.h 헤더 파일 내의 PE 관련 구조체들은 '파일'이라는 명칭 대신 '이미지(Image)'라는 명칭으로 표현된다. 파일이 아니고 왜 이미지일까? 이때 말하는 이미지는 JPEG나 BMP, GIF 등으로 알려진, 그림이나 사진과 같은 이미지를 의미하는 것이 아니라 Image라는 단어의 어원적 의미로 사용된다. 어떤 실체에 대한 그림자, 허상, 그것의 반영이라는 의미에서의 이..

express에서 post json 데이터 사용

post로 데이터를 보낼 때 json형태로 사용을 한다. 그런데 json 형태로 데이터가 오가지 않는다. 2가지 방법이 존재한다. 이전에는 express에 json형태를 다루지 못했다. 그래서 body-parser라는 모듈이 따로 존재했다. body-parser : expressjs.com/en/resources/middleware/body-parser.html const bodyParser = require('body-parser') const express = require('express') const app = express() const port = 80 // application/x-www-form-urlencoded app.use(bodyParser.urlencoded({extended: t..

express 설치 및 사용법

설치 방법 npm install --svae express --save를 하게되면 package.json 파일안에 dependencies로 들어가는 것을 볼 수 있다. 만약 개발할 때만 사용할 모듈이라면 --save-dev라고 입력하면 파일에서 devDependencies라는 곳으로 들어간다. 사용방법 우선 참고 가장 좋은 곳은 expressjs.com 도큐먼트를 보는 것이 가장 좋다! 잘나와있다. const express = require('express') const app = express() const port = 80 app.get('/', (req, res) => { res.send('main 페이지 입니다!') }) app.listen(port, () => { console.log(`Exam..

Distributed CommonObject Model 및 DCE-RPC의 천재와 공용

Distributed Common Object Model (DCOM), DCE-RPC, NT의 스레딩, 프로세스 아키텍처, NT의 인증 토큰은 모든 상호연결되어 있다. COM이 Unix와 다른점을 이해하기 위해서는 COM의 전반적인 철학을 먼저 이해하는 것이 좋다. 소프트웨어에 대한 마이크로소프트의 입장은 항상 돈을 위해 바이너리 패키지를 배포하고 이를 지원하는 경제를 구축하는 것이었다. 따라서, 모든 MS 소프트웨어 아키텍처는 이 모델을 지원한다. 여러 공급 업체에서 타사 COM 모듈을 구입하여 디렉터리 구조에 넣은 다음 VB 스크립트를 사용하여 서로 연결함으로써 상당히 복잡한 응용 프로그램을 완전히 구축할 수 있다. COM 개체는 COM이 지원하는 모든 언어로 작성될 수 있으며, 원활하게 상호운용 된..

시스템/윈도우 2021.01.13

Threading

스레딩은 하나의 프로세스가 단일 메모리 공간을 공유하여 여러 작업을 수행할 수 있도록한다. Windows 커널은 프로세스가 아닌 스레드에 프로세서 시간을 나눠 제공한다. 리눅스는 상당히 약한 "경량 프로세스" 모델로 작업을 수행한다. Linux Native Threads가 구현될 때만, 리눅스는 나머지 현대 OS 세계와 안정적인 스레드 기반을 유지한다. 스레드는 NT 보안 구조가 설명됨에 따라 명확해지므로 리눅스에서 프로그래밍 모델만큼 중요하지 않다. 스레딩은 HRESULT의 이유이다. 기본적으로 정수 값인 HRESULT는 거의 모든 Win32 API호출에서 반환된다. HRESULT는 오류 값 또는 OK 값일 수 있다. 그것이 에러 값이면, GetLastError()의 특정 오류(스레드 로컬 저장소에서 ..

시스템/윈도우 2021.01.13
반응형