gdb操作技巧
开启汇编调试
set disassemble-next-line on
2.汇编单步调试命令
(gdb) si
(gdb) ni
退出layout:ctrl+x 再a键
代码
基于64位,用pushl会编译报错,查看了C编的程序都用pushq 压栈8字节
.section .data
base:
.int 100
plus_no:
.int 8
.section .text
.globl _start
_start:
nop
pushq base #将函数所需参数压入堆栈顶部
pushq plus_no
call cal_func
movl $1, %eax
int $0x80
cal_func:
pushq %rbp
movq %rsp, %rbp
movl $0, %eax
addl 16(%rbp), %eax # pushq 有值的时,rsp会+8,push两次所以偏移16
addl 24(%rbp), %eax
movl %eax, %ebx
popq %rbp
ret
汇编指令了解
汇编代码
#func.s
.section .data
base:
.int 100
.section .bss
.lcomm result, 4
.section .text
.globl _start
_start:
nop
movl $8, %eax
call cal_func
movl $1, %eax
movl result, %ebx
int $0x80
cal_func:
addl $10, %eax
addl base, %eax
movl %eax, result
ret
dump二进制
0000000 457f 464c 0101 0001 0000 0000 0000 0000
0000010 0002 0003 0001 0000 8074 0804 0034 0000
0000020 01f4 0000 0000 0000 0034 0020 0002 0028
0000030 0007 0006 0001 0000 0000 0000 8000 0804
0000040 8000 0804 009b 0000 009b 0000 0005 0000
0000050 1000 0000 0001 0000 009b 0000 909b 0804
0000060 909b 0804 0004 0000 0009 0000 0006 0000
0000070 1000 0000 b890 0008 0000 0de8 0000 b800
0000080 0001 0000 1d8b 90a0 0804 80cd c083 030a
0000090 9b05 0490 a308 90a0 0804 64c3 0000 0000
00000a0 0000 0000 0000 0000 0000 0000 0000 0000
00000b0 0000 0000 8074 0804 0000 0000 0003 0001
00000c0 0000 0000 909b 0804 0000 0000 0003 0002
00000d0 0000 0000 90a0 0804 0000 0000 0003 0003
00000e0 0001 0000 0000 0000 0000 0000 0004 fff1
00000f0 0005 0000 909b 0804 0000 0000 0000 0002
0000100 000a 0000 90a0 0804 0004 0000 0001 0003
0000110 0011 0000 808c 0804 0000 0000 0000 0001
0000120 0000 0000 0000 0000 0000 0000 0004 fff1
0000130 001a 0000 909c 0804 0000 0000 0001 0002
0000140 0035 0000 8074 0804 0000 0000 0010 0001
0000150 0030 0000 909f 0804 0000 0000 0010 0003
0000160 003c 0000 909f 0804 0000 0000 0010 0002
0000170 0043 0000 90a4 0804 0000 0000 0010 0003
0000180 3400 6f2e 6200 7361 0065 6572 7573 746c
0000190 6300 6c61 665f 6e75 0063 475f 4f4c 4142
00001a0 5f4c 464f 5346 5445 545f 4241 454c 005f
00001b0 5f5f 7362 5f73 7473 7261 0074 655f 6164
00001c0 6174 5f00 6e65 0064 2e00 7973 746d 6261
00001d0 2e00 7473 7472 6261 2e00 6873 7473 7472
00001e0 6261 2e00 6574 7478 2e00 6164 6174 2e00
00001f0 7362 0073 0000 0000 0000 0000 0000 0000
0000200 0000 0000 0000 0000 0000 0000 0000 0000
0000210 0000 0000 0000 0000 0000 0000 001b 0000
0000220 0001 0000 0006 0000 8074 0804 0074 0000
0000230 0027 0000 0000 0000 0000 0000 0001 0000
0000240 0000 0000 0021 0000 0001 0000 0003 0000
0000250 909b 0804 009b 0000 0004 0000 0000 0000
0000260 0000 0000 0001 0000 0000 0000 0027 0000
0000270 0008 0000 0003 0000 90a0 0804 009f 0000
0000280 0004 0000 0000 0000 0000 0000 0004 0000
0000290 0000 0000 0001 0000 0002 0000 0000 0000
00002a0 0000 0000 00a0 0000 00e0 0000 0005 0000
00002b0 000a 0000 0004 0000 0010 0000 0009 0000
00002c0 0003 0000 0000 0000 0000 0000 0180 0000
00002d0 0048 0000 0000 0000 0000 0000 0001 0000
00002e0 0000 0000 0011 0000 0003 0000 0000 0000
00002f0 0000 0000 01c8 0000 002c 0000 0000 0000
0000300 0000 0000 0001 0000 0000 0000
000030c
objdump -d 4
4: file format elf32-i386
Disassembly of section .text:
08048074 <_start>:
8048074: 90 nop
8048075: b8 08 00 00 00 mov $0x8,%eax
804807a: e8 0d 00 00 00 call 804808c <cal_func>
804807f: b8 01 00 00 00 mov $0x1,%eax
8048084: 8b 1d a0 90 04 08 mov 0x80490a0,%ebx
804808a: cd 80 int $0x80
0804808c <cal_func>:
804808c: 83 c0 0a add $0xa,%eax
804808f: 03 05 9b 90 04 08 add 0x804909b,%eax
8048095: a3 a0 90 04 08 mov %eax,0x80490a0
804809a: c3 ret
从指令找到
b890 0008 0000 0de8 0000 b800
小段序对应90(nop)开始
90b8 0800 0000 e80d 0000 00b8