0%

整数溢出思考

0x00 漏洞点

这个题目是一个常规堆题目,其他地方没有发现漏洞点,看到abs()函数,就可以想到可能会有整数溢出,有意思的是,abs()函数是通过汇编实现的,并不是glibc库abs()函数,该函数有两种实现方式,第一种方式使用了3次,第二种方式用了一次,下面分析一下这两种实现方式

0x01 第一种汇编语言实现方式

1
2
3
4
5
6
.text:0000000000000F91                 mov     edx, eax
.text:0000000000000F93 mov eax, edx
.text:0000000000000F95 sar eax, 1Fh
.text:0000000000000F98 mov ecx, edx
.text:0000000000000F9A xor ecx, eax
.text:0000000000000F9C sub ecx, eax
  • 首先会通过一个函数将你输入的值放到eax
  • 然后把eax给edx
  • eax的第31位右移31位,(就是如果你eax第32位是1的话,结果,eax是全f,否则为0
  • 然后把edx给ecx
  • ecx和eax异或
  • ecx减eax

总的来说,就是如果eax第31位为1的话,就会执行eax各位取反再加一,否则,eax不变

那么这样的话,如何得到31位有符号的负数呢

我可以想到0x80000000这个数,这个数十进制的话是-2147483648,各位取反就是0x7fffffff再加一 ,还是0x80000000而在有符号数里面,0x80000000仍然为一个负数,所以,发生了整数溢出,这也是abs()函数在libc库里面正常的实现方式

0x02 第二种汇编实现方式

1
2
3
.text:0000000000001042                 cdq
.text:0000000000001043 xor eax, edx
.text:0000000000001045 sub eax, edx

突然发现和第一种方式,殊途同归,操作的结果是一样的。。。。