day03. Jmp指令的使用
例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include<stdio.h>
int
i,gi;
void
* address;
void
main()
{
_asm {
mov eax,eax
mov address,offset _lb1
jmp address
}
i = 2;
_lb1:
gi = 12;
}
|
假设我们构造一个mov指令,想要JMP指令跳转到mov此处,这段指令执行完后,EIP的指令会指向下面的一行地址,如果不指向下一行的地址程序会报错。因此我们在mov指令后面应该放一条指令,让程序回到正常的流程。JMP指令正好达成正个目的,看如下使用ollydbg工具调试在window里情况:
1
2
3
4
|
004113A0 C705
54754100
BA134100 MOV DWORD PTR DS:[
417554
],demo.004113BA
004113AA FF25
54754100
JMP NEAR DWORD PTR DS:[
417554
] ; demo.004113BA
004113B0 C705
64754100
02000000
MOV DWORD PTR DS:[
417564
],
2
004113BA C705
68754100
0C000000 MOV DWORD PTR DS:[
417568
],0C
|
使用gcc工具调试在linux里情况:(注意:windows上的内嵌汇编不能通用的,需要理解完后,写成正向代码)
使用命令: gcc -S -masm=intel demo03.c
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
|
.file
"demo03.c"
.intel_syntax noprefix
.comm i,
4
,
4
.comm j,
4
,
4
.text
.globl main
.type main, @
function
main:
.LFB0:
.cfi_startproc
push rbp
.cfi_def_cfa_offset
16
.cfi_offset
6
, -
16
mov rbp, rsp
.cfi_def_cfa_register
6
mov QWORD PTR [rbp-
8
], rdi
.L2:
mov edx, DWORD PTR j[rip]
mov rax, QWORD PTR [rbp-
8
]
mov DWORD PTR [rax], edx
mov DWORD PTR j[rip],
12
mov DWORD PTR i[rip],
2
jmp .L2
//指向j的内存地址(位移量)
.cfi_endproc
.LFE0:
.size main, .-main
.ident
"GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609"
.section .note.GNU-stack,
""
,@progbits
|