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 |