试图反汇编一个汇编程序,我被某个比较分支难住了。
本质上我有这个:
mov $0x2, %ebx
lea 0xffffffe0(%ebp), %esi
mov %ebx, %eax
add 0xfffffff8(%esi, %ebx, 4), %eax
cmp %eax, 0xfffffffc(%esi, %ebx, 4)
je 8048d59
所以最初 ebx 的值为 2。
然后 %esi 在帧中 %ebp 下方指向 8 个块(单词,值为 32)。 这是一个输入值,我称之为 X
然后 %eax 获取值 2。
然后 add 函数执行:eax = 2 + [X + 8] - 8
所以 X + 2
现在 cmp 线路执行:[X + 8] - 4
所以 X + 4
现在希望我对这里语法的理解是错误的,因为上次我检查 X+4 永远不会等于 X +2
-8
和-4
适用于地址,而不是值。将您的工具切换到英特尔语法,它将更具可读性:
mov ebx,0x2
lea esi,[ebp-0x20]
mov eax,ebx
add eax,DWORD PTR [esi+ebx*4-0x8]
cmp DWORD PTR [esi+ebx*4-0x4],eax
je 0x8048d6d
因此,它正在检查是否x[1]==x[0]+2