GDB主要负责

时间:2017-12-11 07:40:07

标签: c gcc assembly gdb

我正在为我的学校做一个安全项目。

对于这个项目,我有一个二进制文件,我必须做两件事,制作这个二进制文件的伪代码并进行利用。

为了更好地使用 ASM ,我尝试在c中执行完全相同的源代码。我主要有edx的问题。我不知道如何在c:

中这样做
0x080484a5 <+41>:   mov    edx,0x8048468

这是完整的主要代码:

Dump of assembler code for function main:
0x0804847c <+0>:    push   ebp
0x0804847d <+1>:    mov    ebp,esp
0x0804847f <+3>:    and    esp,0xfffffff0
0x08048482 <+6>:    sub    esp,0x20
0x08048485 <+9>:    mov    DWORD PTR [esp],0x40
0x0804848c <+16>:   call   0x8048350 <malloc@plt>
0x08048491 <+21>:   mov    DWORD PTR [esp+0x1c],eax
0x08048495 <+25>:   mov    DWORD PTR [esp],0x4
0x0804849c <+32>:   call   0x8048350 <malloc@plt>
0x080484a1 <+37>:   mov    DWORD PTR [esp+0x18],eax
0x080484a5 <+41>:   mov    edx,0x8048468
0x080484aa <+46>:   mov    eax,DWORD PTR [esp+0x18]
0x080484ae <+50>:   mov    DWORD PTR [eax],edx
0x080484b0 <+52>:   mov    eax,DWORD PTR [ebp+0xc]
0x080484b3 <+55>:   add    eax,0x4
0x080484b6 <+58>:   mov    eax,DWORD PTR [eax]
0x080484b8 <+60>:   mov    edx,eax
0x080484ba <+62>:   mov    eax,DWORD PTR [esp+0x1c]
0x080484be <+66>:   mov    DWORD PTR [esp+0x4],edx
0x080484c2 <+70>:   mov    DWORD PTR [esp],eax
0x080484c5 <+73>:   call   0x8048340 <strcpy@plt>
0x080484ca <+78>:   mov    eax,DWORD PTR [esp+0x18]
0x080484ce <+82>:   mov    eax,DWORD PTR [eax]
0x080484d0 <+84>:   call   eax
0x080484d2 <+86>:   leave
0x080484d3 <+87>:   ret

你能帮我找到如何做主线+ 41请:)?

谢谢

1 个答案:

答案 0 :(得分:1)

0x8048468可能是基于数字的指针值。也许是一个函数指针,因为它位于0x8048350上面的页面(malloc的PLT条目)。但也许只是指向静态缓冲区的指针(可能是只读缓冲区,如字符串文字)。

所以也许void *edx = "hello world";void *edx = &some_function,然后以某种方式使用它。 C语句不映射到单个asm指令,但是使用未优化的输出(gcc -O0),每个C语句都映射到一个连续的指令块,这些指令块完成内存中的所有值。 (这意味着您可以使用调试器修改C变量,并使其在未优化的代码中“正常工作”。)

我没有查看看起来像未经优化的代码的存储/重新加载的混乱,所以我不确定在将值存储到内存之后的下一条指令的内容后,该值到底是做什么的。即时

如果您有源(gcc -S而不是一直编译到二进制文件然后反汇编),请查看编译器的asm输出,或者使用objdump -drwC -Mintel获取该值的重定位信息(如果有)任何。或者使用nm在符号表中查找。

如果它是一个函数指针,那么该地址的反汇编应该有意义。