일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 반응형 페이지 좌표 변환
- netlify variables
- 이미지 맵
- 어셈블리어
- ERR_PNPM_NO_GLOBAL_BIN_DIR
- rwdImageMaps
- C언어
- CSS
- credential error
- aws ec2
- AWS CodePipeline
- S3
- nodejs
- NODE_VERSION
- AWS
- can't getting credentials
- SASS
- node
- ogr2ogr
- Unable to find the global bin directory
- Sequelize Error: Dialect needs to be explicitly supplied as of v4.0.0
- 김골라
- expo
- Error:error:0308010C:digital envelope routines::unsupported
- AWS CodeBuild
- react
- 설치완료안됨
- GeoJSON object too complex/large
- EC2
- 이미지 좌표 추출
- Today
- Total
목록Reversing (6)
ImFe's study
프로그램이 동작하는 동안 함수 안에서 지역 변수(Local Variables)를 사용할 때가 많습니다. 지역 변수는 함수가 종료되고 나면 더 이상 참조되거나 사용되지 않기 때문에, 함수 안에서는 마치 연습장과 같은 역할을 합니다. 지역변수들은 스택(stack)에 저장됩니다. 새로운 함수가 시작 될 때 스택이 준비되고 (Function Prologue) 함수가 종료될 때 스택이 정리됩니다.(Function Epilogue) 이 과정은 레지스터들 중 스택의 가장 윗부분을 가리키는 rsp레지스터와 밀접한 관련이 있습니다. rsp는 스택 포인터로, 스택의 가장 위쪽 주소를 가리킵니다. 스택에 새로운 데이터를 담을수록 스택은 점점 길어집니다. 마지막으로 담은 데이터 위에 새로운 데이터를 쌓아가는 방식으로 길어지게..
어셈블리 코드는 기계 코드와 대응되므로, 기계 코드가 동작할 CPU가 어떤 역할을 하고 어떻게 동작하는지를 알아보는것이 어셈블리 코드를 이해하는데에 도움이 됩니다. CPU의 기본동작은 다음 실행할 명령어를 읽어오고(Fetch) → 읽어온 명령어를 해석한 다음(Decode) → 해석한 결과를 실행하는(Execute) 과정을 반복합니다. 이렇게 한 개의 명령어, 다시 말해 기계 코드가 실행되는 한 번의 과정을 Instruction Cycle이라고 합니다. CPU는 Instruction Cycle을 수행하기 위해 기계 코드에 해당하는 각종 명령어를 해석하기 위한 구성 요소 외에도 읽어온 명령어가 저장된 공간을 임시로 기억해 둘 구성 요소나, 명령어를 실행한 결과를 저장해 둘 구성 요소가 필요합니다. 이렇게 C..
리버스 엔지니어링은 '완성품의 설계도 없이 구조와 동작 과정을 알아내는' 모든 단계를 말합니다. 소스코드가 없는 상태에서 컴파일된 대상 소프트웨어의 구조를 여러가지 방법으로 분석하고, 메모리 덤프를 비롯한 바이너리 분석 결과를 토대로 동작 원리와 내부 구조를 파악한 다음, 이를 바탕으로 원래의 소스가 어떻게 작성된 것인지 알아내는 과정에 대해 공부합니다. 리버싱을 통한 분석 방식에는 크게 두 가지의 방법이 쓰입니다. 프로그램을 실행시키지않는 정적 분석방법과 (Stack Analysis)와 프로그램을 실행시켜서 입출력과 내부 동작 단계를 살피며 분석하는 동적 분석 방법(Dynamic Analysis)이 이 두가지에 해당됩니다. 졍적 분석을 위해서는 실행 파일을 구성하는 모든 요소, 대상 실행 파일이 실제로..
스택 프로텍터들을 사용하지 않는 옵션들입니다. 프로그램 동작에 따른 스택의 변화는 대강 버퍼 변수c EBP(RBP) RET 이렇게 main함수에서 sum()을 호출한 이후 버퍼 RBP RET 변수 = 2 변수 = 1 버퍼 변수c EBP RET 버퍼 위에 스택이 쌓이게됩니다. 매개변수들은 RET 아래에 들어가게됩니다. 또한 sum을 다 실행하면 RET를 통해 변수1부터 최상단 버퍼가 사라집니다(POP) 더 자세히 알아보면 main 함수가 불러와지자 ret가 일단 자리를 잡습니다. main: push %rbp를 통해 rbp를 지정합니다. mov %rsp, %rbp // %rsp=%rbp sub $16, %rsp //rsp에서 16만큼을 뺍니다. = 16만큼 확보후 코드를 작성할 계호기 mov $2 %esi ..
MOV) 전에 포스팅 한 글에도 나와있지만 mov a, b 는 b를 a에 넣는것을 의미합니다 mov 목적지, 값 으로 생각하면 되겠네요 EX) AX를 56h와 같게 하려면 MOV AX,56h //AX의 값이 56h가 된다. 값으로 다른 레지스터를 사용할수도있습니다. MOV AX,BX //AX의 값이 BX로 바뀐다. BX의 값이 nn이라면 AX또한 nn이 됩니다. XCHG) XCHG연산자는 두 레지스터를 바꾸는 역할을 합니다. (exchange) EX) MOV DX,56h MOV AX,3Fh XCHG DX,AX // 값을 교환함으로써 DX는 3Fh, AX는 56h가 됩니다. +8비트 레지스터와 16비트가 교환되지 않도록 해야합니다. 해당 코드는 의미가 없습니다. INC(increase)와DEC(decrea..
칼리리눅스 터미널창을 띄운 후 nano helloworld.s 를 입력해줍니다. s는 어셈블리 코드파일을 의미합니다. 입력한 후 section .data msg db "hello word" section .text global_start _start: mov rax, 1//mov를 통해 rax에 1값을 넣어줍니다. 1은 systemwrite를 call하게 해줍니다. mov rdi, 1//file discrupter에 1을 넣습니다. (=문자열을 출력하겠다) mov rsi, msg//msg라는 포인터변수를 rsi에 넣음으로써 출력합니다 mov rdx, 12//문자열 길이를 지정합니다. syscall//syscall하면서 hello world가 출력됩니다. mov rax, 60//rax에60 값을 넣는건 s..