2023. 6. 15. 10:39

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

2023. 6. 14. 16:00

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

2023. 6. 14. 14:17

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

posted by 블르샤이닝 2023. 6. 14. 10:33
728x90
어셈블리어에서 TEST연산은  오퍼랜드 끼리 AND연산하여 결과값을 CMP연산과 같이 저장하진 않는다. 
 
단지 플래그 값을 세팅하여 분기문에게 영향을 준다 ex) JE, JZ.... 같은 분기문 
 
여기서 중요한것은 TEST EAX, EAX와 같은 명령어다.   
 
얼핏보면 같은 레지스터끼리 AND연산하면 EAX값이 나올텐데 왜 하는걸까라는 생각을 할 수 있다. 
 
하지만 바로 위에 쓰인 TEST명령어는 단지 EAX의 값이 0이냐 아니냐를 판단하기 위해서다 
 
만약 EAX의 값이 0이라면 AND연산결과 당연히 0이 나올것이고, Z플래그 (ZF가 세팅될 것이다.) 
밑에 JE 0040100 
 
점프문이 있다면 ZF가 세팅되므로 0040100주소로 점프할 것이다
 
 

CMP : 첫 번째 Operand에서 두 번째 Operand를 뺍니다. 이 연산의 결과는 Zero Flag에만 영향을 미치고Operand에 영향을 미치지 않고 버려집니다.

TEST : 첫 번째 Operand와 두 번째 Operand를 AND 시킵니다. 이 연산의 결과는 Zero Flag 에만 영향을 미치고 Operand에 영향을 미치지 않고 버려집니다.

 

즉 CMP는 두 값을 빼서 결과를 보고 TEST는 두 값을 AND 연산을해서 결과를 보는데 CMP는 두 Operand가 완전히 같은지 판단할 수 있고 TEST는 두 Operand가 모두 0인지 아닌지 판단할 수 있습니다.

 

TEST의 경우에는 두 Operand가 0이 아닌 경우를 제외하고는 값을 단정지을 수 없 기 때문에 TEST eax, eax와 같은 형태로 사용하여 이 값이 0인지 아닌지 확인할 때 사용된다

참조 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=vps32&logNo=221532426407

728x90
posted by 블르샤이닝 2023. 6. 14. 10:11
728x90

오랜만에 리버싱 교육 받으러옴. 64dbg 초기에 맛만봤었는데 이젠 이제 주 분석툴로 사용되는구나..그리고 사용법을 모르겠다 ㅎㅎㅎ 올리랑 비슷하면서 다르네..열심히 수업들으면서 따라가는 중

 

리버싱에서 가장 중요한건? 역시나 레지스터의 변화값을 캐치하는것이겠찌....그래서 레지스터에 대한 의미를 공부하고 넘어가기

 

참고 자료 : https://blog.naver.com/hellowhale0737/222862446531

----------------------------------------------------------------------------------------------------------------------------------------

 

범용 레지스터, 세그먼트 레지스터, 명령어 포인터 레지스터, 플래그 레지스터가 존재한다.

범용 레지스터 : 주용도가 있으나 다양한 용도로 사용될 수 있는 레지스터

rax(accrumulator register)
함수의 반환 값
rbx(base register)
주된 용도 없음
rcx(counter register)
반복문의 반복 횟수, 각종 연산의 시행 횟수
rdx(data register)
주된 용도 없음
rsi(source index)
데이터를 옮길 때 원본을 가리키는 포인터
rdi(destination index)
데이터를 옮길 때 목적지를 가리키는 포인터
rsp(stack pointer)
사용중인 스택의 위치를 가리키는 포인터
rbp(stack base pointer)
스택의 바닥을 가리키는 포인터

이 외에도 r8~r15까지의 범용레지스터가 존재

세그먼트 레지스터 : cs, ss, ds ,ed ,fs, gs 총 6가지로 각 레지스터의 크기는 16비트이다. 과거에는 사용 가능한 물리 메모리의 크기를 키우려고 사용되었으나, 현재는 cs, ds, ss 가 각각 코드, 데이터, 스택 메모리 영역을 가리킬 때 사용되고, 나머지는 운영체제 범용적인 목적으로 사용된다.

명령어 포인터 레지스터 : CPU가 어느 부분의 코드를 실행할지 가리키는 레지스터 rip이며 크기는 8바이트이다.

플래그 레지스터 : 프로세서의 현재 상태를 저장하고 있는 레지스터이다. RFLAG라는 64비트 레지스터가 존재한다. 실제로는 20여개의 비트만을 사용한다.

CF(Carry Flag)
부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정된다.
ZF(Zero Flag)
연산 결과가 0일 경우 설정된다.
SF(Sign Flag)
연산결과가 음수일 경우 설정된다.
OF(Overflow Flag)
부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정도니다.

64bit 구조에서 r- 에서 하위 32bit 가 e-로 치환될 수 있다.

출처: 드림핵 시스템 해킹 - 컴퓨터 구조

728x90