C语言动态内存反汇编调试

mac2024-03-18  29

#include<stdio.h> #include<stdlib.h> int main() { char *str=(char*)malloc(50); str[0]='a'; 13 14 str[1]='b'; 15 16 str[2]='c'; 17 18 str[3]='d'; 19 str[4]='e'; 20 str[5]='f'; 21 str[6]='g'; 22 str[7]='h'; 23 str[8]='i'; 24 str[9]='j'; 25 str[10]='k'; return 0; } (gdb) disassemble Dump of assembler code for function main: 0x0000000000400526 <+0>: push %rbp 0x0000000000400527 <+1>: mov %rsp,%rbp 0x000000000040052a <+4>: sub $0x10,%rsp 0x000000000040052e <+8>: mov $0x32,%edi 0x0000000000400533 <+13>: callq 0x400410 <malloc@plt> 0x0000000000400538 <+18>: mov %rax,-0x8(%rbp) ## 0x000000000040053c <+22>: mov -0x8(%rbp),%rax ##你这两句是闹着玩呢,不是一个意思么 0x0000000000400540 <+26>: movb $0x61,(%rax) => 0x0000000000400543 <+29>: mov -0x8(%rbp),%rax 0x0000000000400547 <+33>: movb $0x62,(%rax) 0x000000000040054a <+36>: mov -0x8(%rbp),%rax 0x000000000040054e <+40>: movb $0x63,(%rax) 0x0000000000400551 <+43>: mov -0x8(%rbp),%rax 0x0000000000400555 <+47>: movb $0x64,(%rax) 0x0000000000400558 <+50>: mov -0x8(%rbp),%rax 0x000000000040055c <+54>: movb $0x65,(%rax) 0x000000000040055f <+57>: mov -0x8(%rbp),%rax 0x0000000000400563 <+61>: movb $0x66,(%rax) 0x0000000000400566 <+64>: mov -0x8(%rbp),%rax 0x000000000040056a <+68>: movb $0x67,(%rax) 0x000000000040056d <+71>: mov -0x8(%rbp),%rax 0x0000000000400571 <+75>: movb $0x68,(%rax) 0x0000000000400574 <+78>: mov -0x8(%rbp),%rax 0x0000000000400578 <+82>: movb $0x69,(%rax) 0x000000000040057b <+85>: mov -0x8(%rbp),%rax 0x000000000040057f <+89>: movb $0x6a,(%rax) 0x0000000000400582 <+92>: mov -0x8(%rbp),%rax 0x0000000000400586 <+96>: movb $0x6b,(%rax) 0x0000000000400589 <+99>: mov $0x0,%eax 0x000000000040058e <+104>: leaveq 0x000000000040058f <+105>: retq End of assembler dump. 解释案例: 0x0000000000400582 <+92>: mov -0x8(%rbp),%rax 0x0000000000400586 <+96>: movb $0x6b,(%rax) mov -0x8(%rbp),%rax #rbp保存的地址是 0x7fffffffdcb0, -0x8(%rbp)就是0x7fffffffdca8, 这个0x7fffffffdca8 的内存空间保存着一个地址数据, 这个地址数据是0x602010, 0x602010是堆区的一块内内存空间地址, 这个0x602010地址指向的空间里保存着一个数据0 所以print *0x7fffffffdca8 就是 0x602010, print *0x602010 就是 0 "--->"是表示指向的意思 rbp:0x0x7fffffffdca8 --->0x602010--->0 rax:0x602010--->0 回到案例: 0x0000000000400582 <+92>: mov -0x8(%rbp),%rax 0x0000000000400586 <+96>: movb $0x6b,(%rax) 所以 mov -0x8(%rbp),%rax 就是将0x602010这个地址传送给了 rax 寄存器, 也就是rax 寄存器保存了这个0x602010这个地址 movb $0x6b,(%rax) (%rax) 表示引用rax 所指向的空间, 所以这句就是将一个含有0x6b这个值的字节传送给了rax 所指向的内存的空间 进入堆区: (gdb) disas Dump of assembler code for function malloc@plt: => 0x0000000000400410 <+0>: jmpq *0x200c0a(%rip) # 0x601020 0x0000000000400416 <+6>: pushq $0x1 0x000000000040041b <+11>: jmpq 0x4003f0 End of assembler dump. 这地方还不懂, 汇编语言怎么动态分配内存的....哎,待续.....

 

最新回复(0)