기본개념

[ARM Aseembly basics Part 1 to 7] - v1.0

우와해커 2019. 12. 25. 21:10

WritingShellcode 부터 바로 따라하려다 명령어에 막혀서 Basics를 다시 됨.

쉘코드 직접짜는 것도 빡센 작업... 기초부분도 다시 볼게 너무 많으며 x86과 다른 점을 유심히 봐야겠다.

 


LDR과 STR 

 

- LDR과 STR   (Source와 Destination의 위치가 반대임) 
ldr r2, [r0]  메모리 r0에서 레지스터 r2로 값 불러오기 
str r2, [r1]  레지스터 r2의 값을 메모리 r1에 저장하기 


- ARM은 사용되는 모드에 따라 실제 PC의 유효주소가 다름.(항상 다음 명령어 위치를 가리키는 x86과 다른 점)
ldr r0, [pc, #12]  ->여기서 사용되는 pc의 실제 유효주소는 현재 위치에서 다다음 명령어가 유효주소임
                            유효주소부터 오프셋+12를 더한 값이 [pc, #12]가 가리키는 주소가 된다.

- [] 브라켓은 메모리주소를 나타날떄 사용됨
[pc, #12]. 콤마를 사용하여 레지스턷의 상대주소를 호출할 수 있다.


- ARM은 x86과 다르게 사용할 수 있는 immediate values가 제약이 존재한다.

Loading immediate values in a register on ARM is not as straightforward as it is on x86. There are restrictions on which immediate values you can use. What these restrictions are and how to deal with them isn’t the most exciting part of ARM assembly, but bear with me, this is just for your understanding and there are tricks you can use to bypass these restrictions (hint: LDR).


Summary
Remember the three offset modes in LDR/STR:

offset mode uses an immediate as offset
ldr   r3, [r1, #4]

offset mode uses a register as offset
ldr   r3, [r1, r2]

offset mode uses a scaled register as offset
ldr   r3, [r1, r2, LSL#2]


How to remember the different address modes in LDR/STR:

If there is a !, it’s prefix address mode
ldr   r3, [r1, #4]!
ldr   r3, [r1, r2]!
ldr   r3, [r1, r2, LSL#2]!

If the base register is in brackets by itself, it’s postfix address mode
ldr   r3, [r1], #4
ldr   r3, [r1], r2
ldr   r3, [r1], r2, LSL#2

Anything else is offset address mode.
ldr   r3, [r1, #4]
ldr   r3, [r1, r2]
ldr   r3, [r1, r2, LSL#2]



- ARM모드에서 Thumb 모드로 전환: Branch-Exchange.

One of the techniques we can use to make null-bytes less likely to appear in our shellcode is to use Thumb mode. Using Thumb mode decreases the chances of having null-bytes, because Thumb instructions are 2 bytes long instead of 

If you went through the ARM Assembly Basics tutorials you know how to switch from ARM to Thumb mode. If you haven’t I encourage you to read the chapter about the branching instructions “B / BX / BLX” in part 6 of the tutorial “Conditional Execution and Branching“.

 

 

 

STACK AND FUNCTIONS

   

asc방식 낮은주소에서 높은주소 순으로 자람
dec방식 높은주소에서 낮은주소 순으로 자람

* 총 네가지 방식이 있는데 컴파일 설정에 따라다름.


FP 프레임포인터: 스텍메모리에 자료를 박앱헌다.
LR(레지스터): 리턴주소로 사용됨


스택포인터(SP)레지스터 : 함수가 호출되고 현재 가리키고 있는 스택메모리 주소를 저장하고 있다.
프레임포인터(FP)레지스터 : 함수가 호출되기 전의 스택메모리 주소를 저장하고 있다.

스택포인터에는 다음에 쓸 스택메모리의 주소가 저장되고 
프레임포인터에는 함수가 리턴했을 때 복귀할 스택메모리의 주소를 가지고 있다.

하지만 함수 호출이 계속해서 일어난다면 프레임포인터에 저장되어 있는 값은 다음 주소값에의해 덮어씌워져버린다.

그래서 프레임 포인터에 저장된 주소를 스택메모리에 저장하게 된다.

출처 : 윤성우 저. 윈도우즈 시스템 프로그래밍


Finally, it is important to understand the use of BL and BX instructions here. In our example, we branched to a leaf function by using a BL instruction. We use the the label of a function as a parameter to initiate branching. During the compilation process, the label gets replaced with a memory address. Before jumping to that location, the address of the next instruction is saved (linked) to the LR register so that we can return back to where we left off when the function max is finished.

The BX instruction, which is used to leave the leaf function, takes LR register as a parameter. As mentioned earlier, before jumping to function max the BL instruction saved the address of the next instruction of the function main into the LR register. Due to the fact that the leaf function is not supposed to change the value of the LR register during it’s execution, this register can be now used to return to the parent (main) function. As explained in the previous chapter, the BX instruction  can eXchange between the ARM/Thumb modes during branching operation. In this case, it is done by inspecting the last bit of the LR register: if the bit is set to 1, the CPU will change (or keep) the mode to thumb, if it’s set to 0, the mode will be changed (or kept) to ARM. This is a nice design feature which allows to call functions from different modes.

 

 

'기본개념' 카테고리의 다른 글

QEMU 파일전송  (0) 2020.01.05
[ROP] Ret2ZP on ARM (like RTL on x86)  (0) 2020.01.05
[펌] ARM / x86 에서의 함수 호출 /리턴방식 비교  (0) 2020.01.01
StackFrame  (0) 2020.01.01
CMP와 TEST 비교  (0) 2019.12.24