x86 아키텍쳐에서 사용하는 jmp 명령어는 다음과 같다.
이중 상대주소로 점프하는 Opcode는 0xEB, 0xE9이다.
메모리 패치를 위해 어셈블리 하드코딩을 할때 필요하기 때문에 operand에 들어갈 상대주소를 계산해보겠다.
 

 

[0xEB 0xXX]
0xEB는 1Byte operand를 받는다. 
현재 명령어 주소에  이 1Byte를 더한 후  2를 더해주면 jmp 명령이 행해질 주소가 나온다. (Opcode(1byte) + operand(1byte))
operand에 들어갈 값은 1Byte인데 양수는 0x00 ~ 0x7F (0 ~ 127), 음수는 0x80 ~ 0xFF( -128 ~ -1)로 해석한다.
127 or -128 범위에 벗어나는 만큼 점프하려면 0xE9 Opcode를 사용한다.
0xAB2489 주소에서 0xEB 0x84 명령이 실행되면 0xAB2489 + (0x84 => -124 => -0x7C) + 2 = 0xAB240F의 주소로 점프한다.
 

 

[0xE9 0xXX 0xXX 0xXX 0xXX]
0xE9는 2 / 4 Byte operand를 받는다.
현재 명령어 주소에 이 4Byte를 더한 후 5를 더해주면 jmp 명령이 행해질 실제주소가 나온다. (Opcode(1byte) + operand(4byte))
0xAB251E에 -0x92(0xFFFFFF6E는 2의보수)를 더하고  5를 더해주면 점프할 실제주소(0xAB2491)를 구할 수 있다.
 
 
위 계산법을 이용하여 후킹코드를 작성하면서 내 후킹 함수의 주소로 점프하도록 할때 
내 후킹 함수 주소 - 현재 명령어 주소 - 5[sizeof(e9 xx xx xx xx)]의 계산이 나온다.

'리버싱' 카테고리의 다른 글

How To See opcode using IDA  (0) 2017.02.10
Z3 SMT Solver for windows using visual studio  (0) 2017.02.08
Remote Linux Debugging using IDA  (0) 2016.08.25

Options - General - Numbers of opcode bytes 


바이트 수를 보고싶은 만큼 입력해준다.




'리버싱' 카테고리의 다른 글

Assembly Jump Relative Address (Intel x86)  (0) 2019.07.09
Z3 SMT Solver for windows using visual studio  (0) 2017.02.08
Remote Linux Debugging using IDA  (0) 2016.08.25

SMT(Satisfiability modulo theories) Solver란 수학의 방정식을 풀어주는 해석기이다.


z3는 SMT Solver의 한 종류로 마이크로 소프트에서 개발했다고 한다. 


나는 파이썬으로 비쥬얼 스튜디오에서 작업하였다.


https://z3.codeplex.com/releases 에서 다운을 받는다.




비쥬얼 스튜디오를 통해 파이썬 프로젝트를 생성한다.



search Path-add forder to search path 클릭한다.



z3홈페이지에서 다운받은 파일에 있는 bin 폴더로 경로를 지정해준다.




1
2
3
4
5
6
7
8
9
10
11
12
13
from z3 import * # z3모듈을 import
 
x=Int('x')         
y=Int('y')         # 방정식에 사용할 변수 x,y를 선언
 
s=Solver()       # solver를 생성
 
s.add(x+y>5, x>1, y>1# add함수를 통해 방정식을 추가
 
print(s.check())     # 방정식에 만족하는 값을 구한다.
                     # 올바르게 식이 풀렸다면 z3.sat를 반환한다 
 
print(s.model())     # 방정식을 통해 구한 값을 출력한다.
cs

참고 : https://github.com/Z3Prover/z3


'리버싱' 카테고리의 다른 글

Assembly Jump Relative Address (Intel x86)  (0) 2019.07.09
How To See opcode using IDA  (0) 2017.02.10
Remote Linux Debugging using IDA  (0) 2016.08.25


IDA의 설치 경로에 있는 dbgsrv 폴더에서 linux_serverx64를 우분투 서버로 복사한다.



서버에서 linux_serverx64를 실행시킨다.


디버깅 할 ELF파일을 IDA로 연다.



Remote Linux debugger로 선택한 후 디버깅을 실행한다.




Application 과 Input file에는 절대경로를 써주고 ip주소를 입력해주면 디버깅이 시작된다.





이렇게 올리디버거로 exe 파일 디버깅 하듯 


IDA로 elf 파일 디버깅 할 수 있다.


 리눅스 뿐만 아니라 윈도우 맥에서도 똑같이 디버깅 가능하다.





'리버싱' 카테고리의 다른 글

Assembly Jump Relative Address (Intel x86)  (0) 2019.07.09
How To See opcode using IDA  (0) 2017.02.10
Z3 SMT Solver for windows using visual studio  (0) 2017.02.08

+ Recent posts