相关疑难解决方法(0)

"剥削艺术"反汇编示例不一样(C代码)

我正在按照"剥削艺术"一书中的示例来尝试用C语言编写程序,而本书附带了自己的Linux LiveCD,我更喜欢使用BT5(32位).

代码示例非常简单 - (我使用它相同)

#include <stdio.h>

int main()
{
  int i;
  for(i=0; i < 10; i++)       // Loop 10 times.
  {
    puts("Hello, world!\n");  // put the string to the output.
  }
  return 0;                   // Tell OS the program exited without errors.
}
Run Code Online (Sandbox Code Playgroud)

作者正在使用

gcc file_name.c

编译代码,我使用几乎相同的语法,但使用-o,以便将编译路径保存到我想要的地方.

然后他使用命令 -

objdump -D loop | grep -A20主要:

检查编译的二进制文件.

这是他的输出 -

reader@hacking:~/booksrc $ objdump -D a.out | grep -A20 main.:
08048374 <main>:
 8048374:       55                      push   %ebp
 8048375:       89 e5                   mov    %esp,%ebp
 8048377:       83 …
Run Code Online (Sandbox Code Playgroud)

c assembly disassembly

8
推荐指数
1
解决办法
1282
查看次数

浪费内存分配局部变量

这是我的计划:

void test_function(int a, int b, int c, int d){
    int flag;
    char buffer[10];

   flag = 31337;
   buffer[0] = 'A';
}

int main() {
    test_function(1, 2, 3, 4);
}
Run Code Online (Sandbox Code Playgroud)

我用debug选项编译这个程序:

gcc -g my_program.c
Run Code Online (Sandbox Code Playgroud)

我使用gdb并使用intel语法反汇编test_function:

(gdb) disassemble test_function
Dump of assembler code for function test_function:
0x08048344 <test_function+0>:   push   ebp
0x08048345 <test_function+1>:   mov    ebp,esp
0x08048347 <test_function+3>:   sub    esp,0x28
0x0804834a <test_function+6>:   mov    DWORD PTR [ebp-12],0x7a69
0x08048351 <test_function+13>:  mov    BYTE PTR [ebp-40],0x41
0x08048355 <test_function+17>:  leave  
0x08048356 <test_function+18>:  ret    
End of assembler dump.
Run Code Online (Sandbox Code Playgroud)

我拆卸了主要的:

(gdb) …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly gdb disassembly

5
推荐指数
1
解决办法
580
查看次数

在《剥削艺术》示例中,对 [ebp-0xc] 而不是 [ebp-4] 感到困惑

我正在阅读《黑客:剥削的艺术》一书,第二版,以及简单的 C 程序

#include <stdio.h>
int main()
{
    int i;  
    for (i = 0; i < 10; i++)
    {
        puts("Hello, world!\n");
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

书上列出gdb调试会先修改ebp寄存器:

(gdb) x/i $eip 0x8048384 <main+16>: mov DWORD PTR [ebp-4],0x0
Run Code Online (Sandbox Code Playgroud)

正如它所解释的, 这条汇编指令会将 0 的值移动到位于 EBP 寄存器中存储的地址减去 4 的内存中。这是 C 变量 i 存储在内存中的位置;i 被声明为在 x86 处理器上使用 4 字节内存的整数

这对我来说很有意义,但是当我在我的“非常旧的 I386”Linux 笔记本电脑上测试确切的步骤时,我得到的是:

(gdb) x/i $eip => 0x4011b6 <main+29>:   mov    DWORD PTR [ebp-0xc],0x0
Run Code Online (Sandbox Code Playgroud)

所以在我的笔记本电脑上,它显示 [ebp-0xc],而不是 [ebp-4]。根据我的理解,“0xc”作为十六进制将是12,所以它将是12个再见?如果是这样,为什么?

这是我的笔记本电脑上这个简单程序(gdb)反汇编主程序的整个汇编转储

(gdb) x/i $eip 0x8048384 <main+16>: mov DWORD PTR [ebp-4],0x0
Run Code Online (Sandbox Code Playgroud)

x86 assembly gcc

5
推荐指数
1
解决办法
1108
查看次数

标签 统计

assembly ×3

c ×2

disassembly ×2

x86 ×2

gcc ×1

gdb ×1