我正在按照"剥削艺术"一书中的示例来尝试用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) 这是我的计划:
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 程序
#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)