我处理的组装可能的数组,但我想不通的启动值是什么(I am dealing with a possi

2019-09-29 06:06发布

尺寸包含86号。

var_10= dword ptr -10h
var_C= dword ptr -0Ch
size= dword ptr  8
push    ebp
mov     ebp, esp
sub     esp, 28h
mov     eax, [ebp+size]
mov     [esp], eax      ; size
call    _malloc
mov     ds:x, eax
mov     [ebp+var_C], 0
jmp     short loc_804889E

loc_804889E:                        ~~~~~~~~~~~~~~~~~~~~~
mov     eax, [ebp+size]
sub     eax, 1
cmp     eax, [ebp+var_C]
jg      short loc_8048887

loc_8048887:                        ~~~~~~~~~~~~~~~~~~~~~ 
mov     edx, ds:x
mov     eax, [ebp+var_C]
add     edx, eax
mov     eax, [ebp+var_C]
add     eax, 16h
mov     [edx], al
add     [ebp+var_C], 1

我有倒车项目我工作的这部分困难。 还有的地方的部分代码ds:x被移到edx ,并加有var_c ,而且我不确定哪里去了这一点。

对我来说,程序看起来像它调用malloc ,然后会移动到ds:x ,然后移动0var_c

之后,它简单地减去1从我的指针阵列的大小和数目进行比较,以0 ,然后跳转到其中它增加了一个部分ds:xedx所以它可以添加eaxedx

我在处理某类阵列这里的? 什么是那将进入第一个值edxloc_8048887 ? 另一种方式,这可能有助于将看到一个C相当于它......但是,这会是什么,我试图完成,而宁愿通过学习不同的方式来解决。

谢谢!

Answer 1:

在x86汇编有存储在存储器中的变量,并在存储器阵列之间没有严格区分。 这只是取决于你如何访问内存区域。 所有你拥有的是代码和数据。 无论如何,我会说, ds:x是一个数组 ,因为这里的代码:

mov     edx, ds:x        ; edx = [x]
mov     eax, [ebp+var_C] ; eax = something
add     edx, eax         ; edx = [x] + something
mov     eax, [ebp+var_C] ; eax = something
add     eax, 16h         ; eax = something + 0x16
mov     [edx], al        ; [[x] + something ] = al . Yes, ds:x is an array!

什么是价值edxloc_8048887 ? 为了找到它,你只需要一些非常基本的调试技巧。 我假设你有gdb在眼前,如果没有,把它尽快。 然后编译调试符号的代码,并将其链接,然后运行gdb与可执行,在设置一个断点代码loc_8048887 ,与运行的程序r最后检查的价值edx

这些都是你需要的命令:

gdb myexecutable
(gdb) b loc_8048887
(gdb) r
(gdb) info registers edx


文章来源: I am dealing with a possible array in assembly, but I cannot figure out what the starter value is